2013-04-06 80 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代码中的代码,使我的长查询可读和更有用,有没有办法做到这一点?

我认为它更像是在Java脚本中的eval。

+1

如何添加临时表变量和分配? – TechDo 2013-04-06 12:03:33

+0

@techdo多数民众赞成在此谢谢! – user1590636 2013-04-06 12:11:15

回答

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; 

另一种方式是表 - 值得参数。首先在数据库中创建这些类型:

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 2013-04-06 12:22:13

+0

@ user1590636太好了,但你应该了解第二部分。集合比JSON字符串和动态SQL更强大和更灵活。 – 2013-04-06 12:23:10

+0

但集合不适用于复杂的子句,对吧? – user1590636 2013-04-06 12:24:43

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)