2013-04-08 38 views
0

我有一个变量@text varchar,它有一些由符号分隔的值,无论我选择它。例如:如何从字符串中获取WHERE子句中的“单数”值?

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

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

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

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

最好的问候,波格丹

+0

据我所知,任何函数或存储过程都可以内联到任何其他SQL对象中。如果这需要成为单个SQL语句的一部分,那么这可能是不可能的。 – penguat 2013-04-08 10:29:46

回答

1

最简单的方法:产生你的SQL查询语句的字符串,用replace形成的in列表中,然后执行它。

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

虽然简单,但如果字符串中有逗号,则可能会遇到问题。 – penguat 2013-04-08 10:27:00

+0

@蒂姆罗杰斯:对不起,但结果是“ 未能找到存储过程'雇主删除where雇主('约翰','结婚','苏'等)' – BogdanM 2013-04-08 10:58:56

+0

@博格丹对不起,错误的执行使用。 – 2013-04-08 11:00:35

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 
相关问题