SQL删除具有和id范围的对象

时间:2017-03-20 20:25:01

标签: sql sql-server sql-server-2005

我想在sql server中创建一个函数,该函数将id范围作为输入并删除该范围内的所有对象(包括开头和结尾)。

我们举个例子:

delete_objects_with_id(id_start,id_end)

它将删除ID范围为id_start和id_end的所有对象。

问题是id是这种形式的:id_start=2017-0001 id_end=2017-0050是否有一个sql server函数在给定范围的列表上进行迭代?

first_issue content id
2011-01-01  test    2011-0001
2012-10-01  test    2012-0001
2012-11-01  test    2012-0002
2012-11-01  test    2012-0003

2 个答案:

答案 0 :(得分:1)

有一个简单的解决方法,只需删除-字符并将ID转换为BIGINT (假设id的第一部分为year值且第二部分为每年的id,则可以正常工作)

   DELETE FROM TABLE_1
   WHERE CAST(REPLACE(id,'-','')  as BIGINT) >= CAST(REPLACE(id_start,'-','')  as BIGINT)
   AND CAST(REPLACE(id,'-','')  as BIGINT) <= CAST(REPLACE(id_end,'-','')  as BIGINT)

或使用BETWEEN

   DELETE FROM TABLE_1
   WHERE CAST(REPLACE(id,'-','')  as BIGINT) BETWEEN CAST(REPLACE(id_start,'-','')  as BIGINT)
   AND CAST(REPLACE(id_end,'-','')  as BIGINT)

答案 1 :(得分:1)

不,没有内置的SQL Server函数会在给定范围的列表上进行迭代。

如果id值总是九个字符,格式为四个数字,短划线和另外四个数字,那么与字符串的比较将获得id值。

也就是说,您可以编写一个查询(SQL SELECT语句)来返回该范围内的id值,

SELECT t.id
  FROM myobjects t
 WHERE t.id >= '2017-0001'
   AND t.id <= '2017-0050'
 ORDER BY t.id 

并且使用该查询,您可以定义一个游标循环,并循环(迭代)通过返回的那些id值。

如果id值不是规范格式,则范围操作不一定有效。您需要一种机制将id值转换为规范值,以便您可以执行范围。

但是我不知道为什么你需要(或想要)迭代,如果你通过“对象”指的是表中的“行”。如果您可以编写返回这些行的SELECT语句,则可以使用相同的谓词编写DELETE语句,并一次性删除行。

DELETE
  FROM myobjects
 WHERE id >= '2017-0001'
   AND id <= '2017-0050'

一点也不清楚你想要实现什么,为什么你需要“迭代”。但是游标循环是这样做的一种方式。

再一次,回答你问的问题:不。没有“sql server函数迭代给定范围的列表”