我有一个查询的以下部分:使用变量来表示多个值
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