Как передать больше значений для одного параметра в хранимой процедуре на сервере sql

МОЙ текст: -

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, и все готово.

Mahesh 31.10.2018 08:54

@CoderofCode string_split был представлен в версии 2016 года ... более старые версии должны использовать другие методы для разделения строк (обычно UDF)

Zohar Peled 31.10.2018 09:38
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
423
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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 

Вы можете объяснить, как это использовать

ganesh 31.10.2018 13:16

Вы можете использовать команду exec для объявления параметра типа EntityId и передачи ему хранимой процедуры.

Sanal Sunny 31.10.2018 13:18

когда я выполняю ваш код, он показывает ошибку, такую ​​как Msg 102, Level 15, State 1, Procedure usp_delete, Line 5 [Batch Start Line 10] Некорректный синтаксис рядом с 'c'.

ganesh 31.10.2018 14:39

@ganesh я не понял ваш вопрос. пожалуйста, уточните ваше требование

Sanal Sunny 01.11.2018 07:38

@ Sanal Sunny без непосредственной вставки удалить более 1 записи из таблицы, возможно ли

ganesh 01.11.2018 09:39

@ganesh для этого, если вы можете указать причину удаления такой большой записи, мы можем написать процедуру для этой логики

Sanal Sunny 01.11.2018 09:47

там много данных, иногда мне нужно удалить 10 или 100 или 500 записей из таблицы на основе идентификатора. в зависимости от требований мы должны сделать

ganesh 01.11.2018 09:51

@ganesh каковы критерии выбора id

Sanal Sunny 01.11.2018 09:52

id - это первичный ключ

ganesh 01.11.2018 09:55

@ganseh не в том, что является причиной выбора этого идентификатора для удаления. попробуйте реализовать эту логику в своем sp. например: удалить записи, созданные за 30 дней до

Sanal Sunny 01.11.2018 10:06

В более поздних версиях 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.

ganesh 01.11.2018 06:24

exec usp_delete1 '51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64 '

ganesh 01.11.2018 06:25

exec usp_delete1 - это имя sp

ganesh 01.11.2018 06:25

Другие вопросы по теме