2016-04-20 2 views
0

je l'openquery SQL suivantePourquoi ne vais pas ce travail de recherche

SELECT  @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT COUNT(DISTINCT W.Bond) AS NoBID_Count 
               FROM TIB.WRMAST w 
               WHERE (w.BID In (''No Bid'', ''No Cost'', ''None'') AND w.CtlNumber = ''''' + @WarControlID + ''''''')' 

Quand je lance cette requête, je reçois l'erreur suivante:

SELECT * FROM OPENQUERY(RMSPROD2,'SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
               FROM TIBURON.WRMAST w 
               WHERE (w.Bond In ('No Bond', 'No Bail', 'None') AND w.CtlNumber = ''575403''') 
Msg 102, Level 15, State 1, Line 3 
Incorrect syntax near 'No'. 

Quelle est l'erreur qui est jeté je ne indications dans la fenêtre de conception des problèmes

+0

Pourquoi construisez-vous des chaînes de texte pour votre requête? Pourquoi ne pas simplement l'exécuter? – n8wrl

+0

Je vois que le message d'erreur avec le Print @ TSQL montre une clause WHERE différente mais cela a été une erreur de ma part lors de la publication de la question. Couper et coller sans modification – Perry

+0

La vous devriez mettre à jour la question avec le code et l'erreur réels. –

Répondre

2

La cause de votre problème est que vous fermez par inadvertance la cote d'ouverture ici:

SELECT * FROM OPENQUERY(RMSPROD2,'SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
               FROM TIBURON.WRMAST w 
               WHERE (w.Bond In (' 

Par conséquent, vous obtenez l'erreur de No. en Java par exemple, \ est le caractère d'échappement, et ainsi d'assurer la continuité, il nous faudrait écrire:

"SELECT COUNT(DISTINCT W.Bond) AS NoBond_Count 
                FROM TIBURON.WRMAST w 
                WHERE (w.Bond In (\'  " //till the end 

Rechercher caractère d'échappement approprié la langue de votre choix et appliquez-la.

+0

@FernandoGutierrez, ma réponse a été formatée en Java. En Java, vous pouvez écrire {String SQL = "Sélectionner un modèle à partir du dual"}. Si vous tapez select dummy from dual dans Oracle, vous verrez le nom de la colonne renvoyé comme DUMMY, tous en majuscules. Si vous voulez assurer la sensibilité à la casse, vous devez écrire sélectionnez "Dummy" duel. Pour faciliter cela en Java, nous devons écrire String SQL = "select \" Dummy \ "de dual"; C'est ce que j'ai expliqué. Fondamentalement, l'utilisation appropriée des caractères d'échappement. –

+0

Désolé, je ne voulais pas commenter votre réponse, j'ai essayé de commenter la question. Je vais supprimer mon commentaire car ce n'est pas pertinent pour votre réponse. –

1

Je pense que vous manquez un couple de caractères « », essayez la prochaine:

SELECT  @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT COUNT(DISTINCT W.Bond) AS NoBID_Count 
              FROM TIB.WRMAST w 
              WHERE (w.BID In (''''No Bid'''', ''''No Cost'''', ''''None'''') AND w.CtlNumber = ''''' + @WarControlID + ''''''')' 
+0

Je pense que vous avez beaucoup trop de caractères! Vous n'avez besoin que de 2 apostrophes pour les échapper, mais vous en avez 4 pour une raison quelconque. – Zack

0

Je ne pouvais pas trouver une réponse à ce problème donc je suis allé avec une approche différente. J'ai utilisé l'OpenQuery avec ce code

SELECT @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT TIB.WRMAST.WR_INVL, TIB.WRMAST.WR_WARR_CTL,TIBURON.WRMAST.WR_BAIL,TIB.WRWCHG.WC_BAIL 
         FROM TIB.WRMAST 
         LEFT JOIN TIBURON.WRWCHG 
         ON WRWCHG.WC_WR_CHAIN = WRMAST.WRMAST_ROW 
         WHERE TIBURON.WRMAST.WR_WARR_CTL = ''''' + @WarControlID + ''''''')' 
Insert Into @WarrantBail 
    EXEC (@TSQL) 

Et placé les résultats dans une table temporaire. J'ai alors pu utiliser le T-SQL normal pour écrire le reste de la syntaxe nécessaire.