0

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

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

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

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

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

最好的问候, 波格丹

4

2 回答 2

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
于 2013-04-08T10:05:42.913 回答
1

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

declare @sqlquery nvarchar(max)
set @sqlquery = 'Delete Employers where employer_name in (''' + replace(@text, '^', ''',''') + ''')'
EXEC sp_executesql @sqlquery
于 2013-04-08T10:24:37.557 回答