МОЙ текст: -
CREATE proc usp_delete
@tranid int
as
begin
delete from customer where tranid in(@tranid)
end
Примечание: - Я хочу удалить записи более 1 записи с помощью этой хранимой процедуры, например: - если я пропущу 1,2,3,4,5,6, тогда все 6 записей должны быть удалены
Используйте STRING_SPLIT
с IN
, и все готово.
@CoderofCode string_split
был представлен в версии 2016 года ... более старые версии должны использовать другие методы для разделения строк (обычно UDF)
Вы можете использовать table-valued parameter
для этого, вам нужно объявить, что
CREATE TYPE EntityId AS TABLE
( Id INT )
GO
CREATE PROCEDURE usp_delete
@tranid EntityId READONLY
AS
BEGIN
DELETE c
FROM customer c
JOIN @tranid t ON t.Id=c.tranid
END
Для выполнения с помощью TVP объявите переменную типа и передайте ее хранимой процедуре.
DECLARE @entityId EntityId
INSERT INTO @entityId
VALUES(1),(2),(3),(4),(5)
EXEC usp_delete @entityId
Вы можете объяснить, как это использовать
Вы можете использовать команду exec для объявления параметра типа EntityId и передачи ему хранимой процедуры.
когда я выполняю ваш код, он показывает ошибку, такую как Msg 102, Level 15, State 1, Procedure usp_delete, Line 5 [Batch Start Line 10] Некорректный синтаксис рядом с 'c'.
@ganesh я не понял ваш вопрос. пожалуйста, уточните ваше требование
@ Sanal Sunny без непосредственной вставки удалить более 1 записи из таблицы, возможно ли
@ganesh для этого, если вы можете указать причину удаления такой большой записи, мы можем написать процедуру для этой логики
там много данных, иногда мне нужно удалить 10 или 100 или 500 записей из таблицы на основе идентификатора. в зависимости от требований мы должны сделать
@ganesh каковы критерии выбора id
id - это первичный ключ
@ganseh не в том, что является причиной выбора этого идентификатора для удаления. попробуйте реализовать эту логику в своем sp. например: удалить записи, созданные за 30 дней до
В более поздних версиях SQL Server вы можете использовать STRING_SPLIT для преобразования списка с разделителями в отдельные значения, а затем присоединиться к вашей таблице с помощью CROSS APPLY.
CREATE PROC usp_delete @tranid VARCHAR(MAX) AS
BEGIN
DELETE c
FROM customer c
CROSS APPLY STRING_SPLIT(@tranid, ',')
WHERE c.tranid = value
END
GO
EXEC usp_delete '2,3,4'
В более старой версии вы можете написать свою собственную возвращающую табличное значение функцию для преобразования строки с разделителями в набор результатов.
CREATE function [dbo].[delimited_string_to_table] (
@delimiter char(1)
, @string text
)
returns @table table (
seqnbr int not null
, string varchar(255) not null
)
as
begin
declare @pos int
declare @textpos int
declare @chunklen smallint
declare @tmpstr varchar(8000)
declare @leftover varchar(8000)
declare @tmpval varchar(8000)
declare @seq int = 1
set @textpos = 1
set @leftover = ''
while @textpos <= datalength(@string)
begin
set @chunklen = 8000 - datalength(@leftover) / 2
set @tmpstr = @leftover + substring(@string, @textpos, @chunklen)
set @textpos = @textpos + @chunklen
set @pos = charindex(@delimiter, @tmpstr)
while @pos > 0
begin
set @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
insert @table (seqnbr, string) values(@seq, @tmpval)
set @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
set @pos = charindex(@delimiter, @tmpstr)
set @seq = @seq + 1
end
set @leftover = @tmpstr
end
if len(rtrim(ltrim(@leftover))) != 0
insert @table(seqnbr, string) values (@seq, ltrim(rtrim(@leftover)))
return
end
GO
Это изменит пример, чтобы он выглядел так:
CREATE PROC usp_delete @tranid VARCHAR(MAX) AS
BEGIN
DELETE c
FROM customer c
JOIN dbo.delimited_string_to_table(',', @tranid)
ON c.tranid = string
END
GO
Msg 245, уровень 16, состояние 1, процедура usp_delete1, строка 3 [Batch Start Line 87] Ошибка преобразования при преобразовании значения varchar '52' в тип данных int.
exec usp_delete1 '51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 '
exec usp_delete1 - это имя sp