Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在sql server中将参数传递给IN_C#_Sql Server - Fatal编程技术网

C# 如何在sql server中将参数传递给IN

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 --

这是我的名为Employee的表

-----------------------
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的代码不是一个好主意。