在SQL中将字符串列表转换为Int列表

Jul*_*ary 8 sql string stored-procedures casting list

我的存储过程中有一个nvarchar(MAX),它包含int值列表,我这样做是因为无法将int列表传递给我的存储过程,但是,现在我遇到问题,因为我的数据类型是int我想比较字符串列表.有没有办法可以做同样的事情?

---myquerry----where status in (@statuslist)
Run Code Online (Sandbox Code Playgroud)

但是statuslist现在包含字符串值而不是int,那么如何将它们转换为INT?

更新:

USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[SP]
(
@FromDate datetime = 0,
@ToDate datetime = 0,
@ID int=0,
@List nvarchar(MAX) //This is the List which has string ids//
)
Run Code Online (Sandbox Code Playgroud)

AS SET FMTONLY OFF; DECLARE @sql nvarchar(MAX),@ paramlist nvarchar(MAX)

SET @sql    = 'SELECT ------ and Code in(@xList)
  and -------------'
SELECT @paramlist = '@xFromDate datetime,@xToDate datetime,@xId int,@xList nvarchar(MAX)'

EXEC sp_executesql @sql, @paramlist, 
@xFromDate = @FromDate ,@xToDate=@ToDate,@xId=@ID,@xList=@List
PRINT @sql
Run Code Online (Sandbox Code Playgroud)

因此,当我实现拆分的函数时,我无法指定字符或分隔符,因为它不接受它(@List,',').

(','+ @ List +',').

Nic*_* N. 12

可以使用XML参数将int列表发送到存储过程.这样您就不必再解决这个问题了,它是一个更好,更清洁的解决方案.

看看这个问题:将 一组参数传递给存储过程

或检查此代码项目:http: //www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XMLATES-Ty

但是,如果您坚持按照自己的方式进行操作,则可以使用此功能:

CREATE FUNCTION [dbo].[fnStringList2Table]
(
    @List varchar(MAX)
)
RETURNS 
@ParsedList table
(
    item int
)
AS
BEGIN
    DECLARE @item varchar(800), @Pos int

    SET @List = LTRIM(RTRIM(@List))+ ','
    SET @Pos = CHARINDEX(',', @List, 1)

    WHILE @Pos > 0
    BEGIN
        SET @item = LTRIM(RTRIM(LEFT(@List, @Pos - 1)))
        IF @item <> ''
        BEGIN
            INSERT INTO @ParsedList (item) 
            VALUES (CAST(@item AS int))
        END
        SET @List = RIGHT(@List, LEN(@List) - @Pos)
        SET @Pos = CHARINDEX(',', @List, 1)
    END

    RETURN
END
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

SELECT      *
FROM        Table
WHERE status IN (SELECT * from fnStringList2Table(@statuslist))
Run Code Online (Sandbox Code Playgroud)


Aza*_*ade 9

您也可以使用字符串列表.我经常做.

declare @statuslist nvarchar(max)
set @statuslist = '1, 2, 3, 4'

declare @sql nvarchar(max)
set @sql = 'select * from table where Status in (' + @statuslist + ')'
Execute(@sql)
Run Code Online (Sandbox Code Playgroud)

  • 在诸如此类的代码中,您必须小心**SQL注入**攻击 (2认同)