Question

J'utilise la requête T-SQL suivante dans SQL Server 2005 (Management Studio IDE):

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = @id';
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

Je ne sais pas comment passer le paramètre d'entrée @id à la requête EXEC, et passer le résultat du comptage vers @countVal. J'ai vu quelques exemples pour Microsoft SQL Server comme:

EXEC (@sql, @id = @id)

J'ai essayé pour Oracle, mais je suis une erreur de déclaration:

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression"
Était-ce utile?

La solution

Essayez ceci:

EXEC sp_executesql @sql, N'@id int', @id

Plus d'infos sur ce grand article: http://www.sommarskog.se/dynamic_sql.html


En ce qui concerne la sortie, votre SELECT doit ressembler à ceci:

SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id

je sélectionne « id » au lieu de « * » pour éviter de tirer des données inutiles ...

Alors devrait être quelque chose comme votre sql dynamique ceci:

EXEC sp_executesql @sql, 
                   N'@id int, @countVal int OUTPUT', 
                   @id, 
                   @countVal OUTPUT

Cet exemple est adapté à partir du même article lié ci-dessus, dans la section sp_executesql .


En ce qui concerne votre erreur Oracle, vous devez savoir le SQL exact que sp_executesql envoie à Oracle. S'il y a un journal de profileur ou d'une requête dans Oracle, qui peut aider. J'ai une expérience limitée avec Oracle, mais ce serait la prochaine étape logique pour le dépannage de votre problème.

Autres conseils

Je ne sais pas pourquoi vous êtes id passe séparément.

Vous pouvez faire le suivant
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id

La façon rapide et sale est juste construire la chaîne avant d'utiliser l'instruction EXEC, mais ce n'est pas la pratique recommandée comme vous pouvez vous ouvrir à injection SQL.

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

La bonne façon de le faire est d'utiliser la procédure stockée système sp_executesql comme détaillé par Magnifico, et recommandé par Microsoft dans la documentation en ligne est:

EXEC sp_executesql @sql, N'@id int', @id
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top