我正在传递一个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注入攻击!
小智 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)
你想不仅是转换string到int,但几个 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表格可能还有一种快速的方法.
| 归档时间: |
|
| 查看次数: |
32778 次 |
| 最近记录: |