2013-04-06 42 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)