【问题标题】:Delete from Table variable with where condition使用 where 条件从表变量中删除
【发布时间】:2020-06-10 16:41:38
【问题描述】:

我正在根据如下条件从表变量中删除数据。

DELETE FROM @SampleTable WHERE Fname IN (@Fname)

在@Fname 中,我有'abc'、'def'、'ghi' 之类的值。

但删除语句并没有删除数据。 如果我在它正在删除的条件中传递一个 SELECT 语句。

【问题讨论】:

  • 你需要使用STRING_SPLIT()

标签: sql-server tsql


【解决方案1】:

你可以使用STRING_SPLIT()REPLACE()作为

declare @data table (name varchar(45));

insert @data values
('abc'),('def'),('ghi'),('jkl');

select * from @data;

declare @var varchar(100) = '''abc'',''def'',''ghi''';

delete from @data 
where name in(
              select value 
              from string_split(replace(@var, '''', ''), ',')
             );

select * from @data;

Online Demo

【讨论】:

  • 非常感谢,它奏效了我在我的块中使用了'select value from string_split(replace(@var, '''', ''), ',')' 语句它有效。
【解决方案2】:

我喜欢,你可以试试这样的东西。

DECLARE @Query NVARCHAR(MAX)
SET @Query = 'DELETE FROM '+@SampleTable+' WHERE Fname IN ('+@Fname+')'
EXEC SP_EXECUTESQL @Query

【讨论】:

  • 尝试了一种动态方法,但由于“必须声明一个标量变量@sampleTable”而失败。在这种情况下,我必须动态地创建一个表变量声明语句。但这种方法不适合我我有很多删除基于不同的条件。
【解决方案3】:
DECLARE  @SampleTable TABLE (Fname VARCHAR(MAX))
DECLARE @Fname VARCHAR(MAX) ='abc,ghi'
INSERT INTO @SampleTable(Fname)VALUES('abc'),('bb'),('ghi')

DELETE FROM @SampleTable WHERE Fname IN ( SELECT value from  STRING_SPLIT(@Fname,','));
SELECT * FROM @SampleTable

GO
|姓名 | | :---- | | bb |

db小提琴here

【讨论】:

  • 这里 SampleTable 是一个实际的表,在我的例子中它是一个表变量。
  • 根据你写的@SandraGuilepZouaouiZandeh,没有必要使用IN(),它只是Fname = @Fname
  • @Sami 你能解释一下为什么吗?
  • 当然,检查db<>fiddle 我想你可以理解为什么。
  • @Sami 修改了我的代码。我回到 OP suestion 以更好地了解需求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多