我有一個查詢的以下部分:使用變量來表示多個值
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。
我有一個查詢的以下部分:使用變量來表示多個值
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。
那麼,如果你需要在字符串,一個方法是動態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
)通過這兩個參數而不是構建逗號分隔的字符串或處理多個參數。
第一部分是我想要的:) – user1590636 2013-04-06 12:22:13
@ user1590636太好了,但你應該瞭解第二部分。集合比JSON字符串和動態SQL更強大和更靈活。 – 2013-04-06 12:23:10
但集合不適用於複雜的子句,對吧? – user1590636 2013-04-06 12:24:43
請嘗試使用臨時表變量:
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)
如何添加臨時表變量和分配? – TechDo 2013-04-06 12:03:33
@techdo多數民衆贊成在此謝謝! – user1590636 2013-04-06 12:11:15