2013-04-06 6 views
0

У меня есть следующая часть запроса:Использование переменной для представления нескольких значений

Where id in (1,2,3) And country in('France','Italy','Spain') 

Я хочу объявить 2 переменные и сделать это как:

Where id in (idsVaraible) And country in(countriesVriable) 

Это больше похоже подставляя SQL кода в SQL-коде, чтобы сделать мой длинный запрос доступным и более полезным, есть ли способ сделать это?

Я думаю, что это больше похоже на eval в java-скрипте.

+1

Как добавить переменную таблицы temp и присвоить? – TechDo

+0

@techdo это спасибо! – user1590636

ответ

1

Ну, если вам нужно передать эти наборы в виде строк, один путь был бы динамический SQL:

DECLARE @ids VARCHAR(32) = '1,2,3'; 
DECLARE @countries VARCHAR(2000) = 'France,Italy,Spain'; 

DECLARE @sql NVARCHAR(MAX) = N'SELECT ... FROM ... 
    WHERE id IN (' + @ids + ') AND country IN (''' 
    + REPLACE(@countries, ',',''',''') + ''');'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

Другой способ table- оцененных параметров. Сначала нужно создать эти типы в базе данных:

CREATE TYPE dbo.TVPids AS TABLE(ID INT); 
CREATE TYPE dbo.TVPcountries AS TABLE(Country VARCHAR(255)); 

Теперь хранимая процедура может принимать эти типы в качестве входных данных:

CREATE PROCEDURE dbo.whatever 
    @i dbo.TVPids READONLY, 
    @c dbo.TVPcountries READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT ... FROM dbo.yourtable AS t 
    INNER JOIN @i AS i ON i.ID = t.ID 
    INNER JOIN @c AS c ON c.country = t.country; 
END 
GO 

Теперь ваше приложение может передать эти два параметра в виде наборов (например, из DataTable) вместо создания разделенной запятыми строки или обработки нескольких параметров.

+0

первая часть - все, что я хотел :) – user1590636

+0

@ user1590636 отлично, но вы также должны узнать о второй части. Наборы гораздо более мощные и гибкие, чем строки JSON и динамический SQL. –

+0

, но набор не будет работать для сложной группы по предложениям, не так ли? – user1590636

1

Пожалуйста, попробуйте использовать временную таблицу переменных:

DECLARE @tblID as TABLE(ID INT) 
DECLARE @tblCountry as TABLE(Country NVARCHAR(50)) 

INSERT INTO @tblID VALUES (1),(2),(3) 
INSERT INTO @tblCountry VALUES ('France'),('Italy'),('Spain') 

WHERE id in (select ID from @tblID) And country in(select Country from @tblCountry) 
Смежные вопросы