C# 如何在sql server中将参数传递给IN
这是我的名为Employee的表C# 如何在sql server中将参数传递给IN,c#,sql-server,C#,Sql Server,这是我的名为Employee的表 ----------------------- Column Name | Data Type ---------------------- ID | int EmpId | nvarchar Name | nvarchar Salary | decimal 看看这张表的所有记录 ------------------------------ ID | EmpId | Name | Salary --
-----------------------
Column Name | Data Type
----------------------
ID | int
EmpId | nvarchar
Name | nvarchar
Salary | decimal
看看这张表的所有记录
------------------------------
ID | EmpId | Name | Salary
------------------------------
1 | 200 | Bulbul | 2000.00
2 | 201 | Ahmed | 2000.00
3 | 202 | Rakib | 2500.00
4 | 203 | Rubel | 3000.00
5 | 204 | Zia | 4000.00
现在,如果我想将给定员工id的所有记录都交给IN操作符,我会得到以下结果。很好
SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN ('200','201')
------------------------------
ID | EmpId | Name | Salary
------------------------------
1 | 200 | Bulbul | 2000.00
2 | 201 | Ahmed | 2000.00
但是,如果我将employee id作为参数传递,那么就不会得到期望的结果。只得到空结果
DECLARE @Params AS NVARCHAR(MAX) = '''200'',''201'''
SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN (@Params)
------------------------------
ID | EmpId | Name | Salary
------------------------------
| | |
| | |
现在我需要使用参数in操作符得到以下结果。我期望的结果是:
------------------------------
ID | EmpId | Name | Salary
------------------------------
1 | 200 | Bulbul | 2000.00
2 | 201 | Ahmed | 2000.00
请帮我得到我想要的结果。提前感谢。我建议使用表类型参数
CREATE TYPE dbo.IdList AS TABLE (Id INT)
GO
DECLARE @Ids dbo.IdList
INSERT INTO @Ids(Id)VALUES(200),(201)
SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN (SELECT Id FROM @Ids)
我建议使用表类型参数
CREATE TYPE dbo.IdList AS TABLE (Id INT)
GO
DECLARE @Ids dbo.IdList
INSERT INTO @Ids(Id)VALUES(200),(201)
SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN (SELECT Id FROM @Ids)
请尝试:
DECLARE @Params AS NVARCHAR(MAX) = '200,201'
exec ('SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN ('+@Params+')')
请尝试:
DECLARE @Params AS NVARCHAR(MAX) = '200,201'
exec ('SELECT EmpId, Name, Salary
FROM Employee
WHERE EmpId IN ('+@Params+')')
添加下表值SQL函数fn\u split:
CREATE FUNCTION [dbo].[fn_Split](@sText varchar(8000), @sDelim varchar(20) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000))
AS
BEGIN
DECLARE @idx smallint,
@value varchar(8000),
@bcontinue bit,
@iStrike smallint,
@iDelimlength tinyint
IF @sDelim = 'Space'
BEGIN
SET @sDelim = ' '
END
SET @idx = 0
SET @sText = LTrim(RTrim(@sText))
SET @iDelimlength = DATALENGTH(@sDelim)
SET @bcontinue = 1
IF NOT ((@iDelimlength = 0) or (@sDelim = 'Empty'))
BEGIN
WHILE @bcontinue = 1
BEGIN
--If you can find the delimiter in the text, retrieve the first element and
--insert it with its index into the return table.
IF CHARINDEX(@sDelim, @sText)>0
BEGIN
SET @value = SUBSTRING(@sText,1, CHARINDEX(@sDelim,@sText)-1)
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
--Trim the element and its delimiter from the front of the string.
--Increment the index and loop.
SET @iStrike = DATALENGTH(@value) + @iDelimlength
SET @idx = @idx + 1
SET @sText = LTrim(Right(@sText,DATALENGTH(@sText) - @iStrike))
END
ELSE
BEGIN
--If you can’t find the delimiter in the text, @sText is the last value in
--@retArray.
SET @value = @sText
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
--Exit the WHILE loop.
SET @bcontinue = 0
END
END
END
ELSE
BEGIN
WHILE @bcontinue=1
BEGIN
--If the delimiter is an empty string, check for remaining text
--instead of a delimiter. Insert the first character into the
--retArray table. Trim the character from the front of the string.
--Increment the index and loop.
IF DATALENGTH(@sText)>1
BEGIN
SET @value = SUBSTRING(@sText,1,1)
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
SET @idx = @idx+1
SET @sText = SUBSTRING(@sText,2,DATALENGTH(@sText)-1)
END
ELSE
BEGIN
--One character remains.
--Insert the character, and exit the WHILE loop.
INSERT @retArray (idx, value)
VALUES (@idx, @sText)
SET @bcontinue = 0
END
END
END
RETURN
END
并执行此查询以获取输出:
DECLARE @Params AS NVARCHAR(MAX) = '200,201'
SELECT EmployeeId, Name
FROM Employee
WHERE EmployeeId IN (select value from dbo.fn_Split(@Params,','))
希望这有帮助 添加下表值SQL函数fn\u split:
CREATE FUNCTION [dbo].[fn_Split](@sText varchar(8000), @sDelim varchar(20) = ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000))
AS
BEGIN
DECLARE @idx smallint,
@value varchar(8000),
@bcontinue bit,
@iStrike smallint,
@iDelimlength tinyint
IF @sDelim = 'Space'
BEGIN
SET @sDelim = ' '
END
SET @idx = 0
SET @sText = LTrim(RTrim(@sText))
SET @iDelimlength = DATALENGTH(@sDelim)
SET @bcontinue = 1
IF NOT ((@iDelimlength = 0) or (@sDelim = 'Empty'))
BEGIN
WHILE @bcontinue = 1
BEGIN
--If you can find the delimiter in the text, retrieve the first element and
--insert it with its index into the return table.
IF CHARINDEX(@sDelim, @sText)>0
BEGIN
SET @value = SUBSTRING(@sText,1, CHARINDEX(@sDelim,@sText)-1)
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
--Trim the element and its delimiter from the front of the string.
--Increment the index and loop.
SET @iStrike = DATALENGTH(@value) + @iDelimlength
SET @idx = @idx + 1
SET @sText = LTrim(Right(@sText,DATALENGTH(@sText) - @iStrike))
END
ELSE
BEGIN
--If you can’t find the delimiter in the text, @sText is the last value in
--@retArray.
SET @value = @sText
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
--Exit the WHILE loop.
SET @bcontinue = 0
END
END
END
ELSE
BEGIN
WHILE @bcontinue=1
BEGIN
--If the delimiter is an empty string, check for remaining text
--instead of a delimiter. Insert the first character into the
--retArray table. Trim the character from the front of the string.
--Increment the index and loop.
IF DATALENGTH(@sText)>1
BEGIN
SET @value = SUBSTRING(@sText,1,1)
BEGIN
INSERT @retArray (idx, value)
VALUES (@idx, @value)
END
SET @idx = @idx+1
SET @sText = SUBSTRING(@sText,2,DATALENGTH(@sText)-1)
END
ELSE
BEGIN
--One character remains.
--Insert the character, and exit the WHILE loop.
INSERT @retArray (idx, value)
VALUES (@idx, @sText)
SET @bcontinue = 0
END
END
END
RETURN
END
并执行此查询以获取输出:
DECLARE @Params AS NVARCHAR(MAX) = '200,201'
SELECT EmployeeId, Name
FROM Employee
WHERE EmployeeId IN (select value from dbo.fn_Split(@Params,','))
希望这有帮助
最后,我通过以下方式获得了预期的结果:
------------------------------
ID | EmpId | Name | Salary
------------------------------
1 | 200 | Bulbul | 2000.00
2 | 201 | Ahmed | 2000.00
最后,我通过以下方式获得了预期的结果:
------------------------------
ID | EmpId | Name | Salary
------------------------------
1 | 200 | Bulbul | 2000.00
2 | 201 | Ahmed | 2000.00
获取错误消息102,级别15,状态1,第2行“READONLY”附近的语法不正确。请删除READONLY并确保插入到@Ids中,它工作正常。永远不要说有错误或类似的错误,一定要把你收到的错误信息准确地贴出来。@Lasse V Karlsen。谢谢你的评论。@NEO。我更正了我的答案。它执行时没有任何错误。在“READONLY”附近获得错误消息102,级别15,状态1,第2行不正确的语法。删除READONLY并确保插入到@Ids中,它工作正常。永远不要说有错误或类似的错误,一定要把你收到的错误信息准确地贴出来。@Lasse V Karlsen。谢谢你的评论。@NEO。我更正了我的答案。执行时没有任何错误。此解决方案没有帮助吗?你为什么投了反对票?我已经检查过了,它在语句查询中与您的预期输出配合良好,在轻量级执行计划中具有优化方式?此解决方案没有帮助吗?你为什么投了反对票?我已经检查过了,它可以在语句查询中以优化的方式在轻量级执行计划中正常工作。SQL Server的哪个版本?SQL Server的哪个版本?如果您确定SQL注入没有问题,。我认为这是最好的答案。此查询将是最佳的,因为它可以使用统计信息。但是,无论何时调用,我们都会一直重新编译。注:从性能的角度来看,这个评论。-1因为动态查询执行总是比较慢,而且无论如何都要避免。是的。了解执行计划和SQL注入攻击。编写使用动态SQL的代码不是一个好主意。如果您确定SQL注入没有问题,。我认为这是最好的答案。此查询将是最佳的,因为它可以使用统计信息。但是,无论何时调用,我们都会一直重新编译。注:从性能的角度来看,这个评论。-1因为动态查询执行总是比较慢,而且无论如何都要避免。是的。了解执行计划和SQL注入攻击。编写使用动态SQL的代码不是一个好主意。