2014-09-17 2 views
-1

У меня есть следующий SQL запросSQL, как написать это как сценарий

Select * from Name 
where surname in ('test1', 'test2') 

, который работает

Но я хотел бы сделать следующее

DECLARE @Surname as VARCHAR(100) 
set @Surname = 'test1' + ',' + 'test2' 

Select * from Name 
where surname in @Surname 

это реальный запрос, используемый

DECLARE @COESNo as VARCHAR(100) 
set @COESNo = '121108883' + ',' + '121108890' 

declare @sql varchar(max) 
set @sql = 'select [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] from [CERTIFICATE_DETAILS] where [Certificate_no] in (' 
set @sql = @sql + @COESNo + ')' 

exec @sql 

получить ошибку

The name 'select [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] from [CERTIFICATE_DETAILS] where [Certificate_no] in (121108883,121108890)' is not a valid identifier. 

не похож на работу

любых идей

+0

вам нужно будет создать ваше заявление и выполнить - как 'объявить @sql VARCHAR (макс)' 'установить @sql =«Select * от имени где фамилия в ('' 'set @sql = @sql + @surname + ')'' После создания инструкции просто скажите 'exec @ sql' – Murtaza

+0

Вам следует молиться и надеяться, что у кого-то нет странных имен или намеренно пытается сделать sql-инъекцию в ваш системы с предлагаемым подходом. (http://xkcd.com/327/) – faester

+0

Зачем вы хотите это сделать? Я думаю, у вас здесь проблема xy. http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem. Ваша проблема, как указано, не имеет смысла. Нам нужно знать, откуда вы получаете свой список IN, и как вы будете заполнять их в своем скрипте. Вручную? Excel? приложение? хранимая процедура? –

ответ

-1

вам нужно будет создать ваше заявление и выполнить - как

declare @sql varchar(max) 
set @sql = 'Select * from [Name] where surname in (' 
set @sql = @sql + @surname + ')' 

После создания заявления только например

exec @sql 

Вы также можете проверить сформированный запрос является правильным или не используя print

print @sql 

Пожалуйста, используйте печать перед выполнением команды (это поможет вам в исправлении запроса есть какая-либо ошибка.).

EDIT: В соответствии с комментарием. Поскольку имя является ключевым словом для SQL - нам нужно будет использовать квадратную скобку против него. Я изменил заявление в своем ответе.

Edit 2: На основе дальнейших комментариев - Во-первых, я хотел бы знать тип данных Certificate_no столбца в базе данных. Если это поле varchar, вам нужно будет иметь одинарные кавычки вокруг каждого значения.

Название SELECT [LEI_ACCEPT] , [PREFERED_LEI] , [INSPECTION_COMPANY], [INSP_ACCEPT] FROM[CERTIFICATE_DETAILS] WHERE [Certificate_no] IN ('121108883','121108890')

Вам нужно будет создать -

DECLARE @COESNo as VARCHAR(100) 
set @COESNo = '''121108883''' + ',' + '''121108890''' 

Поскольку номер сертификат VARCHAR строки сборки потребуется апостроф в сформированном запросе, который будет отображаться с тремя одинарными кавычками.

Я создал Рабочую DEMO для вас на SQL FIDDLE - CLICK HERE

+0

, когда я его печатаю , Я получаю правильный sql, но когда я использую exec, он говорит, что имя не является допустимым идентификатором – user2206329

+0

У вас есть таблица с именем Name - если да, то используйте квадратные скобки для '[Name]' – Murtaza

+0

@ user2206329 - попробуйте работать с соответствующими стандартами конкатенации строк вы должны получить запрос. – Murtaza

2

Есть два популярных решения.

Сначала нужно построить строку с запросом и использовать sp_executesql для ее запуска.

второй, чтобы написать (или найти) функцию (что-то вроде SplitText2Table()), который преобразует разделенных запятой строку в таблице и записи запроса, которые используют эту функцию - что-то вроде:

select * 
from name 
where surname in (select item from SplitText2Table(@surnames)) 
0

Это не является решением для точной проблемы в вопросе. (?) Но, может быть, вы могли бы вместо того, чтобы использовать этот обходной путь:

declare @SurName1 nvarchar(20) 
declare @SurName2 nvarchar(20) 

set @SurName1='test1' 
set @SurName2='test2' 

select * from [Name] where [surname] in (@SurName1, @SurName2) 
Смежные вопросы