如何在 SQL 服务器中的一个参数中传递多个整数值
How to pass multiple integer values in one parameter in SQL Server
我正在 SSRS 中生成报告并尝试添加一个签入以说明此参数何时等于此值然后显示这些值,但因为参数是一个整数而且我不能传递多个整数值到一个参数中。
我该怎么做?
这是我正在尝试做的事情的例子:
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
IF @EntityGroupID = 741
BEGIN
SET @EntityGroupID= 3097,3098,3099,3100,3101,3125
END
SELECT *
FROM tEntityGroup
WHERE ID in (@EntityGroupID)
将其作为 table 变量传递,如
declare @tbl table(EntityGroupID int);
insert into @tbl
select 3097
union
select 3098
union
select 3099
那你可以直接说
SELECT *
FROM tEntityGroup
WHERE ID in (select EntityGroupID from @tbl);
您可以先用 ID,Value
对创建一个 table 变量:
DECLARE @EntityGroup TABLE(Id INT, VALUE VARCHAR(50))
INSERT INTO @EntityGroup VALUES (741,null)
IF (SELECT Id FROM @EntityGroup) = 741
BEGIN
update @EntityGroup SET VALUE = '3097,3098,3099,3100,3101,3125' WHERE Id = 741
END
然后我们可以根据需要提取数据:
SELECT *
FROM tEntityGroup
WHERE ID in
(
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS EntityGroupID
FROM
(
SELECT CAST('<XMLRoot><RowData>' + REPLACE(VALUE,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM @EntityGroup
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
)
为什么不只使用两个 SELECT
语句。如果您已经有了控制流程,只需使用它来执行 SELECT
,例如
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
IF @EntityGroupID = 741
BEGIN
SELECT *
FROM tEntityGroup
WHERE ID IN (3097,3098,3099,3100,3101,3125);
END
ELSE
BEGIN
SELECT *
FROM tEntityGroup
WHERE ID = @EntityGroupID;
END
或者如果你真的想用一个 select 来做,那么使用一个 table 变量:
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
DECLARE @Entities TABLE (ID INT NOT NULL);
INSERT @Entities (ID)
SELECT @EntityGroupID
WHERE @EntityGroupID != 741
UNION ALL
SELECT ID
FROM (VALUES (3097),(3098),(3099),(3100),(3101),(3125)) t (ID)
WHERE @EntityGroupID = 741;
SELECT *
FROM tEntityGroup
WHERE ID in (SELECT ID FROM @Entities);
我正在 SSRS 中生成报告并尝试添加一个签入以说明此参数何时等于此值然后显示这些值,但因为参数是一个整数而且我不能传递多个整数值到一个参数中。
我该怎么做?
这是我正在尝试做的事情的例子:
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
IF @EntityGroupID = 741
BEGIN
SET @EntityGroupID= 3097,3098,3099,3100,3101,3125
END
SELECT *
FROM tEntityGroup
WHERE ID in (@EntityGroupID)
将其作为 table 变量传递,如
declare @tbl table(EntityGroupID int);
insert into @tbl
select 3097
union
select 3098
union
select 3099
那你可以直接说
SELECT *
FROM tEntityGroup
WHERE ID in (select EntityGroupID from @tbl);
您可以先用 ID,Value
对创建一个 table 变量:
DECLARE @EntityGroup TABLE(Id INT, VALUE VARCHAR(50))
INSERT INTO @EntityGroup VALUES (741,null)
IF (SELECT Id FROM @EntityGroup) = 741
BEGIN
update @EntityGroup SET VALUE = '3097,3098,3099,3100,3101,3125' WHERE Id = 741
END
然后我们可以根据需要提取数据:
SELECT *
FROM tEntityGroup
WHERE ID in
(
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS EntityGroupID
FROM
(
SELECT CAST('<XMLRoot><RowData>' + REPLACE(VALUE,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM @EntityGroup
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
)
为什么不只使用两个 SELECT
语句。如果您已经有了控制流程,只需使用它来执行 SELECT
,例如
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
IF @EntityGroupID = 741
BEGIN
SELECT *
FROM tEntityGroup
WHERE ID IN (3097,3098,3099,3100,3101,3125);
END
ELSE
BEGIN
SELECT *
FROM tEntityGroup
WHERE ID = @EntityGroupID;
END
或者如果你真的想用一个 select 来做,那么使用一个 table 变量:
DECLARE @EntityGroupID INT
SET @EntityGroupID = 741
DECLARE @Entities TABLE (ID INT NOT NULL);
INSERT @Entities (ID)
SELECT @EntityGroupID
WHERE @EntityGroupID != 741
UNION ALL
SELECT ID
FROM (VALUES (3097),(3098),(3099),(3100),(3101),(3125)) t (ID)
WHERE @EntityGroupID = 741;
SELECT *
FROM tEntityGroup
WHERE ID in (SELECT ID FROM @Entities);