t-sql将逗号分隔的字符串转换为int,而不使用用户创建的函数

Kuk*_*koy 11 t-sql

我正在传递一个int的列表(以逗号分隔)

即. 1, 2, 3, 4

到我的sp.但我收到一个错误,因为列表是一个字符串,我正在比较一个int字段.有没有办法让我将列表转换为int,而不使用用户创建的函数?

注意:employeeID是INT

declare @intArray varchar(200)

SELECT *
FROM tbl_Employee
WHERE employeeID IN ( @intArray )
Run Code Online (Sandbox Code Playgroud)

错误是"无法将类型varchar转换为int"

TTo*_*oni 12

您不希望将该列表转换为int,而是转换为int列表.

没有强制转换操作符或函数,但您可以使用动态SQL来解决它.

基本上你写

EXECUTE('SELECT * FROM tbl_Employee WHERE employeeID IN ('+@intArray+')')
Run Code Online (Sandbox Code Playgroud)

请注意SQL注入攻击!

  • 这是一个很好的本地方式来做OP想要的.请记住,随着员工名单和"ID"的增长,"IN"短语变得越来越无效.在2005/2008年,"EXISTS"是首选.此外,无法缓存动态SQL,因此执行永远不会像其他语句那样变得更快. (3认同)

小智 7

如果您使用的是SQL Server 2016及更高版本,请使用STRING_SPLIT

declare @intArray varchar(200)
Set @intArray = '3,4,6,7'

SELECT *
FROM tbl_Employee
WHERE employeeID IN (select * from STRING_SPLIT(@intArray, ','))
Run Code Online (Sandbox Code Playgroud)

  • 不仅你的 SQL Server 应该是 2016,`compatibility_level` 也应该是 130 或更高。阅读更多 [此处](/sf/answers/3304425771/)。 (2认同)

Bra*_*rad 6

你想不仅是转换stringint,但几个 int s转换一个.您是否期望您SELECT将返回阵列中列出的所有员工和ID?

我意识到你想要在没有功能的情况下这样做.但是,这就是我目前的工作方式,而且效果很好.从你的回答中拿出你想要的.

while如果您在SQL 2005/2008中,此代码使用一个循环,可能会改进为递归CTE.您可以将函数的输出用作表格,您可以使用该表格INNER JOIN快速过滤.

/*
************************************************************************************************************************
    Name:           ConvertDelimitedListIntoTable
    Description:    Converts a list of delimited values into a table for use like a dynamic IN statment

    Modification History
    Date        Author          Description
    ==========  ============    ====================================
    2009-01-31  B. Williams     Initial Creation

************************************************************************************************************************
*/
ALTER FUNCTION [dbo].[ConvertDelimitedListIntoTable] (
     @list NVARCHAR(MAX) ,@delimiter CHAR(1) )
RETURNS @table TABLE ( 
     item VARCHAR(255) NOT NULL )
AS 
    BEGIN
        DECLARE @pos INT ,@nextpos INT ,@valuelen INT

        SELECT  @pos = 0 ,@nextpos = 1

        WHILE @nextpos > 0 
            BEGIN
                SELECT  @nextpos = CHARINDEX(@delimiter,@list,@pos + 1)
                SELECT  @valuelen = CASE WHEN @nextpos > 0 THEN @nextpos
                                         ELSE LEN(@list) + 1
                                    END - @pos - 1
                INSERT  @table ( item )
                VALUES  ( CONVERT(INT,SUBSTRING(@list,@pos + 1,@valuelen)) )
                SELECT  @pos = @nextpos

            END

        DELETE  FROM @table
        WHERE   item = ''

        RETURN 
    END
Run Code Online (Sandbox Code Playgroud)

使用:

DECLARE @intArray varchar(200)

SELECT *
FROM  tbl_Employee e
      INNER JOIN dbo.ConvertDelimitedListIntoTable(@intArray,',') arr
                 ON e.EmployeeID = arr.Item
Run Code Online (Sandbox Code Playgroud)

使用tally表格可能还有一种快速的方法.