如何从字符串中获取WHERE子句中的“单数”值?

时间:2013-04-08 09:55:45

标签: sql-server ssis

我有一个变量@text varchar,它有一些由符号分隔的值,无论我选择它是什么。例如:

declare @text varchar
set @text='John^Marry^Smith^Ane^Sue^'

我需要删除一些数据,但由于它是一个不同的服务器和数据库(很长的故事),我必须在WHERE子句中指定我的字符串中的值,如下所示:

Delete Employers where employer_name in ('John','Marry','Smith','Ane','Sue')

可以这样做吗?最重要的是没有任何其他对象,如程序或函数?

最好的问候,波格丹

2 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题,那么答案是肯定的,就在你已经说明了。您可以使用以下条带将字符串转换为表格。如果将返回表声明为表变量,则可以将其作为

滚动到脚本中
DELETE where EXISTS(....)



Create function [dbo].[atf_BarListToTable]
    (@list ntext)
RETURNS @tbl TABLE (ListPosn int IDENTITY(1, 1) NOT NULL,
                          SString  VARCHAR(1028) NOT NULL) AS
BEGIN
    DECLARE @pos int
    DECLARE @textpos int
    DECLARE @ChunkLength smallint
    DECLARE @str nvarchar(4000)
    DECLARE @tmpstr nvarchar(4000)
    DECLARE @leftover nvarchar(4000)
    SET @textpos = 1
    SET @leftover = ''
    WHILE @textpos <= datalength(@list) / 2
    BEGIN
        SET @ChunkLength = 4000 - datalength(@leftover) / 2
        SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @ChunkLength))
        SET @textpos = @textpos + @ChunkLength
        SET @pos = charindex('|', @tmpstr)
        WHILE @pos > 0
            BEGIN
                SET @str = substring(@tmpstr, 1, @pos - 1)
                INSERT @tbl (SString) VALUES( @str)
                SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
                SET @pos = charindex('|', @tmpstr)
            END
        SET @leftover = @tmpstr
    END
    IF ltrim(rtrim(@leftover)) <> ''
        INSERT @tbl (SString) VALUES(@leftover)
    RETURN
END

答案 1 :(得分:1)

最简单的方法:使用replace生成您的SQL查询作为字符串,以形成您的in列表,然后执行它。

declare @sqlquery nvarchar(max)
set @sqlquery = 'Delete Employers where employer_name in (''' + replace(@text, '^', ''',''') + ''')'
EXEC sp_executesql @sqlquery