S'échapper de devis unique en openquery à l'aide de requête dynamique
J'ai besoin de récupérer des données à partir d'un serveur à l'aide d'un paramètre, @PickedDate par exemple. La requête fonctionne très bien si je saute @A @B, mais il retourne toujours une erreur due à la disparition d'un seul devis. Veuillez informer, merci.
La requête:
Declare @OPENQUERY nvarchar(500), @TSQL nvarchar(max), @LinkedServer nvarchar(20), @A varchar(5), @B varchar(5), @PickedDate varchar(8)
Set @PickedDate = '20150501'
Set @A = 'AAA'
Set @B = 'BBB'
Set @LinkedServer = 'LinkedServerName'
Set @OPENQUERY = 'Select * From Openquery('+ @LinkedServer + ','''
Set @TSQL = 'SELECT cases.casenum, user.username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened > DateAdd(day,1-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
And cases.date_opened <= DateAdd(day,8-datepart(dw,Convert(date,' + @PickedDate + ')), Convert(date,' + @PickedDate + '))
And cases.code IN (' + @A +', ' + @B + ')
ORDER BY casenum'')'
Exec (@Openquery+@TSQL)
Fournisseur OLE DB "MSDASQL" du serveur lié "LinkedServerName" a retourné le message "[Sybase][ODBC Driver][SQL Anywhere]Colonne " AAA "non trouvé".
Msg 7321, Niveau 16, État 2, Ligne 1
Une erreur s'est produite lors de la préparation de la requête "
SELECT cases.casenum, username, code
From cases
Inner join user
On cases.casenum = user.user_id
Where cases.date_opened >
DateAdd(day,1-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.date_opened <=
DateAdd(day,8-datepart(dw,Convert(date,20150501)), Convert(date,20150501))
And cases.code IN (AAA, BBB)
ORDER BY casenum"
pour exécution à l'encontre du fournisseur OLE DB "MSDASQL" du serveur lié "LinkedServerName".
comment sur Et cas.code ("+chr(39) + @A +', ' + chr(39)+ @B + chr(39)+ ')
Il se comporte de la même chose que ( "'+ @ + "' , "' + @B + "'). Donne toujours la "syntaxe Incorrecte près de 'AAA'."
char(39)
stackoverflow.com/questions/14657056/...Il se comporte de la même chose que ( "'+ @ + "' , "' + @B + "'). Donne toujours la "syntaxe Incorrecte près de 'AAA'."
OriginalL'auteur Weihui Guo | 2015-05-08
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin des guillemets simples autour de vos variables, puisque vous êtes en train de leur faire des littéraux de chaîne. Mais aussi de compliquer c'est le fait que vous essayez de créer une instruction SQL dans une chaîne qui comprend une autre instruction SQL dans une chaîne de caractères. Donc, vous avez besoin pour faire de votre ligne de la lire comme suit:
Vous avez besoin de deux jeux de guillemets, de sorte que le littéral de chaîne à l'intérieur de votre littéral de chaîne est correctement interprété. Hein? La droite. 🙂
En fin de compte vous avez besoin pour construire une chaîne qui a cette Syntaxe SQL valide:
Vous avez besoin de deux guillemets autour de l'AAA et BBB dans votre intérieur d'une chaîne SQL, car il est aussi le code SQL à l'intérieur d'une chaîne. Si vous avez besoin de double guillemets pour obtenir des guillemets à l'intérieur de votre chaîne principale en cours de création.
J'ai voulu utiliser @A @B pour échapper les guillemets simples. Dans ce cas, je peux simplement des cas d'utilisation.code ("AAA"", ""B"").
OriginalL'auteur Brian Pressler
Vous devez ajouter les guillemets simples afin qu'ils apparaissent dans la dynamique du contexte de la requête. Essayez de changer cette ligne:
Lorsque vous obtenez l'erreur, qu'obtenez-vous lorsque vous IMPRIMEZ @Openquery+@TSQL ?
OriginalL'auteur Tab Alleman
À l'aide de Brian Pressler réponse je vous suggère de créer une fonction pour formater la params si vous avez divers openquery appels, parfois en citant un tas de choses eyebreaker.
Alors vous pouvez l'utiliser dans votre openqueries comme ceci:
OriginalL'auteur 4D1C70