我有以下查询部分:
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 。
请尝试使用临时表变量:
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)
好吧,如果您需要将这些集合作为字符串传递,一种方法是动态 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
现在,您的应用程序可以将这两个参数作为集合(例如从 a DataTable
)传递,而不是构建逗号分隔的字符串或处理多个参数。