2011-06-21 4 views
0
SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice] 
WHERE ([OfficeID] IN (@Office)) 
AND (('0003' in @Activity) OR ('0007' in @Activity)) 
ORDER BY [Name] ASC 

ce script SQL échoue à récupérer la source de données, une fenêtre vous demandera les définitions de « @Activity » et « @Office », même si ces paramètres existent.Aide avec cette syntaxe SQL

Mais si je devais traiter « @Activity » comme une seule valeur non-tableau, comme ceci:

SELECT [ID] + ' - ' + CAST([OfficeID] as char(5)) AS [ZoneID] , [Name] FROM [dbo].[ZoneByOffice] 
WHERE ([OfficeID] IN (@Office)) 
AND ((@Activity ='0003') OR (@Activity = '0007')) 
ORDER BY [Name] ASC 

alors il ne demande pas de définitions, mais sur le rapport si je sélectionne plusieurs éléments acitivité , il va signaler ',' virgules dans la syntaxe et échouer.

Répondre

0

Si @Activity est une valeur unique, vous pouvez utiliser

(@Activity IN ('0003', '0007')) 

Mais si @Activity est une liste de valeurs séparées par des virgules, vous ne pouvez pas passer comme un seul paramètre de toute façon. Les paramètres SQL ne peuvent jamais remplacer une liste de valeurs - seulement une seule valeur. Si la chaîne que vous passez pour le paramètre ressemble à une liste de nombres, cela n'a pas d'importance. C'est toujours juste une valeur unique, qui se trouve être une chaîne de chiffres et de virgules.

Vous pouvez this trick, popularisé sur Stack Overflow par Joel Spolsky lui-même:

WHERE ',' + @Activity + ',' LIKE '%,' + '0003' + ',%' 
    OR ',' + @Activity + ',' LIKE '%,' + '0007' + ',%' 

Mais il exécute terriblement, parce que les caractères génériques de premier plan dans les modèles forcent une table-scan.

+0

merci pour le tour éducatif, mais j'ai découvert que tout ce que j'avais à faire était de mettre le @Activity like ('0003' dans (@Activity)) pour que cela fonctionne> _ < – CodeMinion

+0

Eh bien, ne vous attendez pas à travailler sur n'importe quelle autre marque de base de données. –

+0

Merci Bill, je vais garder cela à l'esprit – CodeMinion