我正在使用SQL Server 2008 R2版本。我有一個簡單的表格,它有多列。 EmpId
其中一列的類型爲nvarchar(50)
SQL Server:與多個值合併
我在寫一個存儲過程,其中我接收到一個可以具有以下值之一的輸入。
- 單EMPID:
'12345'
- 多EMPID的逗號分隔:
'12345, 56789, 98987'
null
我想要什麼:
如果EMPID是單EMPID只是返回
select * from table_name where EmpId = @empId
如果EMPID是用逗號分隔值,只返回
select * from table_name where EmpId in (select * from dbo.splitstring(@empId))
如果EMPID爲null,只返回
Select * from table_name
無需where子句。
涵蓋所有三個條件,這是我努力:
DECLARE @empId nvarchar(2000)
SET @empId = '97050001,97050003, 97050004'
SELECT TOP 10 empId
FROM Employee
WHERE empId in (COALESCE((select * from dbo.splitstring(@empId)),[empId]))
我收到以下錯誤:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我理解錯誤。 COALESCE()
正期待一個值,但是當我得到逗號分隔值時,splitstring
函數會返回多個值。
我不希望建立一個動態查詢,所以除了用的if else塊複製代碼,我檢查,如果EMPID是空運行select * from table_name
其他運行select * from table name where empId in()
。我有什麼選擇?
以逗號分隔字符串分割成表,我使用這個功能:
CREATE FUNCTION dbo.splitstring (@stringToSplit VARCHAR(MAX))
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)[email protected])
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
其中@empId爲空 或由於OP想要檢索的所有數據,同時通過'NULL' EMPID在(SELECT * FROM dbo.splitstring(@empId))' –
@juergend爲什麼不使用'SELECT * FROM TABLE_NAME 。 –
@ahmedabdelqader:這就是我的查詢所做的 –