2016-02-22 2 views
1

Ceci est mon codeOPENQUERY (SERVERNAME, StoredProcedure) Erreur de syntaxe

DECLARE @stringvariable nvarchar(200) = 'Hello'; 

DECLARE @sql nvarchar(2000) = SELECT * INTO ##global FROM OPENQUERY(DB1, ''EXEC GETCASE ''' + @stringvariable + ''''')' 

impression @sql retourne une requête correctement formaté, mais SQL Server n'aime pas @stringvariable et renvoie une erreur

Msg 102 , Niveau 15, État 1, Ligne 11
Syntaxe incorrecte près de 'Hello'.

Voici ce que la requête ressemble émis

SELECT * INTO ##global FROM OPENQUERY(DB1, 'EXEC GETCASE 'Hello'') 

Comment puis-je éviter cette erreur? Il semble que parce que ma procédure stockée prend un paramètre de chaîne, il rejette la requête. J'ai lu que OPENQUERY ne supporte pas les variables, mais j'ai paramétré la variable donc ça devrait marcher?

Appréciez votre aide!

Répondre

0

La procédure stockée existe dans une base de données et un schéma. Vous devez fournir ceux-ci. base de données et le schéma db_name supposant schema_name:

DECLARE @stringvariable nvarchar(200) = 'Hello'; 
SET @stringvariable=REPLACE(@stringvariable,'''',''''''''''); -- doubly doubled single quotes for the dynamic statement 
DECLARE @sql nvarchar(2000) = 'SELECT * INTO ##global FROM OPENQUERY(DB1, ''SET FMTONLY OFF;EXEC db_name.schema_name.GETCASE ''''' + @stringvariable + ''''''')'; 

J'ai aussi assuré des guillemets simples sont correctement saisies dans le @stringvariable.

Il est également probable que vous ayez besoin de démarrer la requête avec SET FMTONLY OFF; donc j'ai ajouté cela.


Mise à jour: Pour tester, j'ai créé en suivant la procédure simple sur un serveur lié local_server dans la base TEST_TT

CREATE PROCEDURE [dbo].[tst] 
    @i VARCHAR(128) 
AS 
    SELECT @i AS field; 

Je puis a couru les éléments suivants:

DECLARE @var VARCHAR(128)='TT.'; 
SET @var=REPLACE(@var,'''',''''''''''); -- doubly doubled single quotes for the dynamic statement 
DECLARE @stmt VARCHAR(4000)='SELECT * INTO ##tt FROM OPENQUERY(local_server,''SET FMTONLY OFF;EXEC TEST_TT.dbo.tst '''''[email protected]+''''''');'; 
EXEC (@stmt); 
SELECT * FROM ##tt; 
DROP TABLE ##tt; 

et moi avons reçu les résultats . Je compte 7 (!!) guillemets simples à la fin de la requête ... beurk! Partie originale mise à jour avec le même nombre de citations.

+0

Salut TT merci pour votre réponse, j'utilise le nom de base de données, et le nom du schéma, mais je n'ai pas ajouté cela dans mon code Stackoverflow. J'ai suivi votre format mais je reçois toujours la même erreur. La sortie imprimée est la même que précédemment (sauf qu'elle affiche maintenant 'SET FMTONLY OFF') –

+0

@GovindRai Mise à jour avec quelque chose qui fonctionne sur mon système (2012). –

+0

@GovindRai encore un changement dans le remplacement des guillemets simples dans la variable. SQL dynamique peut devenir moche =) –