我有一个变量@text varchar
,它有一些由符号分隔的值,无论我选择它是什么。例如:
declare @text varchar
set @text='John^Marry^Smith^Ane^Sue^'
我需要删除一些数据,但由于它是一个不同的服务器和数据库(很长的故事),我必须在WHERE子句中指定我的字符串中的值,如下所示:
Delete Employers where employer_name in ('John','Marry','Smith','Ane','Sue')
可以这样做吗?最重要的是没有任何其他对象,如程序或函数?
最好的问候,波格丹
答案 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