【发布时间】:2018-09-20 22:31:50
【问题描述】:
我有一个像这样的简单存储过程:
[dbo].[getStatusList]
@Extended NVARCHAR(255) = 'Project Status',
@Exclude NVARCHAR(255) = '',
@All BIT = 0
AS
SET NOCOUNT ON
IF (@All = 0)
BEGIN
SELECT
[GeneralKey],
[Label]
FROM
[General]
WHERE
[Extended] = @Extended
AND [Label] <> @Exclude
ORDER BY
[OrderID];
END
ELSE
BEGIN
IF (@All = 1)
BEGIN
SELECT
0 AS [GeneralKey],
'Any' AS [Label],
0 AS [OrderID]
UNION ALL
SELECT
[GeneralKey],
[Label],
[OrderID]
FROM
[General]
WHERE
[Extended] = @Extended
AND [Label] <> @Exclude
ORDER BY
[OrderID];
END
END
我想做的是执行这个存储过程,发送两次@Extended参数,如:
exec getStatusList @Extended = 'title1' AND @Extended = 'title2'
不可能在exec 上做这样的事情吗?解决这个问题的唯一方法是向存储过程添加另一个参数?
更新
正如下面提到的cmets,我试过这个:
CREATE OR ALTER PROCEDURE usp_Get_StatusListByDesignType
-- Add the parameters for the stored procedure here
@Extended NVARCHAR(MAX),
@Exclude NVARCHAR(255) = '',
@All BIT = 0
AS
SET NOCOUNT ON
IF (@All = 0)
BEGIN
DECLARE @Parameter1 VARCHAR(50)
DECLARE @Parameter2 VARCHAR(50)
;WITH CTE AS
(
SELECT
*,
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) rn
FROM
STRING_SPLIT (@Extended,',')
)
SELECT
@Parameter1 = MAX(CASE WHEN rn = 1 THEN VALUE END),
@Parameter2 = MAX(CASE WHEN rn = 2 THEN VALUE END)
FROM
CTE
SELECT
[GeneralKey], [Label]
FROM
[General]
WHERE
[Extended] IN (SELECT @Parameter1, @Parameter2)
AND [Label] <> @Exclude
ORDER BY
[OrderID];
END
ELSE
BEGIN
IF (@All = 1)
BEGIN
SELECT
0 AS [GeneralKey],
'Any' AS [Label],
0 AS [OrderID]
UNION ALL
SELECT
[GeneralKey],
[Label],
[OrderID]
FROM
[General]
WHERE
[Extended] IN (SELECT @Parameter1, @Parameter2)
AND [Label] <> @Exclude
ORDER BY
[OrderID];
END
RETURN;
但我收到此错误:
当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。
【问题讨论】:
-
你的 sql-server 版本是多少?
-
SQL 管理 2017 @D-Shih
-
为什么要发送两次
@Extended?你的 SP 有什么逻辑吗? -
只是因为我想要在扩展列@D-Shih 上有 title1 和 title2 的值
标签: sql sql-server tsql parameters