2015-04-24 4 views
0

Я установил мойSQL Set/Declare Variable

declare @area as varchar(500) 

set @area = '''Area1'',''Area2''' 

Я пытался поставить его в WHERE пункте, но он не обнаруживает area. Я предполагаю, что что-то не так с set @area =?

Это то, что я пытаюсь привести его в:

where area in (@area) 

Пожалуйста, помогите, спасибо.

+3

'область в()' краю применено: @area такое же, как 'области в ('' 'Area1' ''. 'Area2' '') '. Таким образом, SQL Server ищет фактическое значение в таблице, равное целой строке: «Area1», «Area2». SQL Server не знает, что такое массив. Если вы хотите, чтобы он проверял несколько значений, вам нужно разбить эту строку с помощью функции split или использовать динамический SQL или, желательно, путем их ввода в виде отдельных значений с использованием параметра table-value. См. Http://sqlperformance.com/2012/07/t-sql-queries/split-strings и http://sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with -less -t-SQL. –

+0

Если вы можете объяснить, где '' '' Area1 '', '' Area2 '' '' и от того, что у вас есть над этим, это будет намного легче помочь. –

+0

@AaronBertrand Я буду использовать ASP для выполнения этого sql. ASP будет использовать область «Area1», «Area2», «Area3» '' – Nguyenal07

ответ

1

Поскольку у вас есть список элементов для сравнения, использовать table variable накапливать данные сравнения, например:

DECLARE @area as TABLE(Name VARCHAR(50)); 
INSERT INTO @area(Name) VALUES ('Area1'), ('Area2'); 

Вы можете использовать это либо:

SELECT * 
FROM MyTable 
WHERE MyCol in (SELECT Name FROM @Area); 

Или лучше, через прямое соединение (удаленные соединения будут устранены):

SELECT * 
FROM MyTable INNER JOIN @Area 
ON MyTable.MyCol = @Area.Name; 
+0

Я не могу использовать метод переменной таблицы, я пытаюсь передать мою область asp в sql – Nguyenal07

+0

Вы по-прежнему можете - здесь [некоторые решения] (http://stackoverflow.com/questions/337704/parameterize-a-sql-in-clause). Вы также можете обернуть это в PROC, а затем привязать параметр, оцененный таблицей. ADO позволяет связывать IEnumerables и DataTables к параметрам таблицы. – StuartLC

0

Это должно быть как и др, а затем переменная VARCHAR:

where area in (select a from(values('Area1'),('Area2')) t(a)) 
0

Попробуйте что-то вроде

declare @area as varchar(500) 

set @area = 'Area1,Area2' 

SELECT * 
FROM TableName 
where area in (
       SELECT Split.a.value('.', 'VARCHAR(100)') AS Area 
       FROM (SELECT CAST ('<M>' + REPLACE(@area, ',', '</M><M>') 
       + '</M>' AS XML) AS String) AS A 
       CROSS APPLY String.nodes ('/M') AS Split(a) 
       ) 
+0

Осторожно, если область имеет символы типа '&', это сломается.Также мы не знаем, что OP имеет контроль над входным форматом (вы изменили «'Area1' ',' 'Area2''' на' Area1, Area2'). –

0

использование попытка динамического SQL как-

declare @area as varchar(500) 
set @area = 'Area1,Area2' 
DECLARE @sql varchar(500) 
set @sql='SELECT * 
FROM [dbo].[tbl] AS t 
WHERE area in ('[email protected]+')' 
exec (@sql) 

или

declare @area as varchar(500) 
set @area = '''Area1'',''Area2''' 
DECLARE @sql varchar(500) 
set @sql='SELECT * 
FROM [dbo].[tbl] AS t 
WHERE area in ('[email protected]+')' 
PRINT @sql 
exec (@sql) 
0

Результат кода

Запрос

declare @area as varchar(500) 
set @area = '''Area1'',''Area2''' 

Введите

print 'where area in (' + @area + ')' 

Результат

where area in ('Area1','Area2')