我想在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
答案 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函数迭代给定范围的列表”