我正在尝试调试其他人的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上使用与报表相同的值运行报表查询呢?
8条答案
按热度按时间nwnhqdif1#
Table variable
或
jbose2ul2#
假设变量类似于:
存储过程以如下形式使用它:
您可以建立IntList并呼叫程序,如下所示:
或者如果您自己提供IntList
kcugc4gi3#
你是对的,在SQL-Server中没有数据类型可以保存整数列表。但是你可以做的是将整数列表存储为字符串。
然后,您可以将字符串拆分为单独的整数值,并将它们放入表中。您的过程可能已经完成了此操作。
您也可以使用动态查询来取得相同的结果:
**注意:**我没有对此查询进行任何清理,请注意它容易受到SQL注入的攻击。请根据需要进行清理。
j9per5c44#
对于SQL Server 2016+和Azure SQL数据库,添加了STRING_SPLIT函数,这将是此问题的完美解决方案。以下是文档:https://learn.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
以下是一个示例:
查询结果为1,3
gjmwrych5#
最后,我得出结论,如果不修改查询的工作方式,我就无法将值存储在变量中。我使用SQL profiler捕获值,然后将它们硬编码到查询中,看看它是如何工作的。有18个这样的整数数组,其中一些数组包含30多个元素。
我认为MS/SQL需要引入一些额外的数据类型。数组是很常见的,我不明白为什么你不能在存储过程中使用它们。
cczfrluj6#
如果您使用的是字符串列表,SQL中有一个名为
string_split
的新函数。您可以使用
in
传递此查询,如下所示:mwyxok5s7#
我用这个:
1-在构建的脚本中声明一个临时表变量:
2-分配到临时表:
3-在WHERE语句中需要时引用该表:
zbdgwd5y8#
您不能这样做,但可以执行整个查询并将其存储在变量中。
例如: