Помогите с этим синтаксисом sql - PullRequest
0 голосов
/ 21 июня 2011
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

этот сценарий sql не сможет получить источник данных, всплывающее окно запросит определения '@Activity' и '@Office', даже если эти параметры существуют.

Но если бы я былобрабатывать '@Activity' как одно значение, не относящееся к массиву, например:

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

, тогда он не будет запрашивать определения, но в отчете, если я выберу несколько элементов Acctivity, он сообщит ',запятые в синтаксисе и сбой.

1 Ответ

0 голосов
/ 21 июня 2011

Если @Activity - одно значение, вы можете использовать

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

Но если @Activity - это список значений, разделенных запятыми, вы все равно не можете передать его как один параметр. Параметры SQL никогда не могут заменить список значений - только одно значение . Если строка, которую вы передаете для параметра, выглядит как список чисел, это не имеет значения. Это все еще одно значение, представляющее собой строку цифр и запятых.

Вы можете попробовать этот трюк , популяризированный в «Переполнении стека» самим Джоэлем Спольски:

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

Но это работает ужасно, потому что ведущие символы подстановки в шаблонах вызывают сканирование таблицы.

...