我正在尝试调试其他人的SQL报告,并已将底层报告查询放入SQL 2012的查询窗口中。
报告要求的参数之一是整数列表。这是通过多选下拉框在报告上实现的。报告的底层查询在where
子句中使用这个整数列表,例如
select *
from TabA
where TabA.ID in (@listOfIDs)
我不想修改我正在调试的查询,但是我不知道如何在SQL Server上创建一个可以保存这种类型的数据的变量来测试它。
例如:
declare @listOfIDs int
set listOfIDs = 1,2,3,4
没有可以保存整数列表的数据类型,那么如何在我的SQL Server上使用与报告相同的值运行报告查询?
发布于 2013-08-22 14:01:07
declare @listOfIDs table (id int);
insert @listOfIDs(id) values(1),(2),(3);
select *
from TabA
where TabA.ID in (select id from @listOfIDs)
或
declare @listOfIDs varchar(1000);
SET @listOfIDs = ',1,2,3,'; --in this solution need put coma on begin and end
select *
from TabA
where charindex(',' + CAST(TabA.ID as nvarchar(20)) + ',', @listOfIDs) > 0
发布于 2015-10-16 21:11:40
假设变量类似于:
CREATE TYPE [dbo].[IntList] AS TABLE(
[Value] [int] NOT NULL
)
并且存储过程正在以这种形式使用它:
ALTER Procedure [dbo].[GetFooByIds]
@Ids [IntList] ReadOnly
As
您可以创建IntList并调用过程,如下所示:
Declare @IDs IntList;
Insert Into @IDs Select Id From dbo.{TableThatHasIds}
Where Id In (111, 222, 333, 444)
Exec [dbo].[GetFooByIds] @IDs
或者,如果您自己提供IntList
DECLARE @listOfIDs dbo.IntList
INSERT INTO @listofIDs VALUES (1),(35),(118);
发布于 2013-08-22 13:35:17
您是对的,SQL-Server中没有可以保存整数列表的数据类型。但是您可以做的是将整数列表存储为字符串。
DECLARE @listOfIDs varchar(8000);
SET @listOfIDs = '1,2,3,4';
然后,您可以将字符串拆分为单独的整数值,并将它们放入表中。您的过程可能已经做到了这一点。
您还可以使用动态查询来实现相同的结果:
DECLARE @SQL nvarchar(8000);
SET @SQL = 'SELECT * FROM TabA WHERE TabA.ID IN (' + @listOfIDs + ')';
EXECUTE (@SQL);
https://stackoverflow.com/questions/18371968
复制相似问题