我试图调试别人的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上使用与报表相同的值运行报表查询?


当前回答

我用这个:

1-在构建的脚本中声明一个临时表变量:

DECLARE @ShiftPeriodList TABLE(id INT NOT NULL);

分配给临时表:

IF (SOME CONDITION) 
BEGIN 
        INSERT INTO @ShiftPeriodList SELECT ShiftId FROM [hr].[tbl_WorkShift]
END
IF (SOME CONDITION2)
BEGIN
    INSERT INTO @ShiftPeriodList
        SELECT  ws.ShiftId
        FROM [hr].[tbl_WorkShift] ws
        WHERE ws.WorkShift = 'Weekend(VSD)' OR ws.WorkShift = 'Weekend(SDL)'

END

在WHERE语句中引用表:

INSERT INTO SomeTable WHERE ShiftPeriod IN (SELECT * FROM @ShiftPeriodList)

其他回答

你是对的,在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);

注意:我没有对这个查询做任何处理,请注意它很容易受到SQL注入的攻击。按要求清洁。

您不能这样做,但可以执行将其存储在变量中的整个查询。

例如:

DECLARE @listOfIDs NVARCHAR(MAX) = 
    '1,2,3'

DECLARE @query NVARCHAR(MAX) = 
    'Select *
     From TabA
     Where TabA.ID in (' + @listOfIDs + ')'

Exec (@query)

我用这个:

1-在构建的脚本中声明一个临时表变量:

DECLARE @ShiftPeriodList TABLE(id INT NOT NULL);

分配给临时表:

IF (SOME CONDITION) 
BEGIN 
        INSERT INTO @ShiftPeriodList SELECT ShiftId FROM [hr].[tbl_WorkShift]
END
IF (SOME CONDITION2)
BEGIN
    INSERT INTO @ShiftPeriodList
        SELECT  ws.ShiftId
        FROM [hr].[tbl_WorkShift] ws
        WHERE ws.WorkShift = 'Weekend(VSD)' OR ws.WorkShift = 'Weekend(SDL)'

END

在WHERE语句中引用表:

INSERT INTO SomeTable WHERE ShiftPeriod IN (SELECT * FROM @ShiftPeriodList)

表变量

declare @listOfIDs table (id int);
insert @listOfIDs(id) values(1),(2),(3);    

select *
from TabA
where TabA.ID in (select id from @listOfIDs)

or

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

最后我得出的结论是,如果不修改查询的工作方式,我就不能将值存储在变量中。我使用SQL分析器捕获值,然后将它们硬编码到查询中,以查看它是如何工作的。有18个这样的整数数组,有些数组中有超过30个元素。

我认为MS/SQL有必要在语言中引入一些附加的数据类型。数组是非常常见的,我不明白为什么你不能在存储过程中使用它们。