Сохраните несколько переменных в переменной SQL и используйте их для удаления записей в таблице. - PullRequest
0 голосов
/ 20 февраля 2019

Привет, мне было интересно, как можно добиться удаления нескольких значений в таблице.

У меня следующий запрос:

DELETE FROM dbo.MainJobs WHERE  @MainJobId =IDKey
declare @subjob nvarchar;
SET @subjob = (SELECT SubJobFamily FROM dbo.Jobz where  JobFamily = @MainJobId ) --has mutiple values in the table
Delete dbo.Jobz where JobFamily = @MainJobId
DELETE dbo.Relationship1 where SubJobs =  @subjob  --deletion of multiple rows

Подводя итог, я пытаюсь удалитьотношения нескольких подзадач, однако есть несколько подзадач, которые связаны с основным семейством заданий, и я получаю сообщение об ошибке при сохранении его в переменную - @subjob.Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

В SQL Server есть два типа переменных - это скалярные переменные (все встроенные типы данных являются скалярными переменными) и есть табличные переменные.Вы можете объявить табличную переменную либо используя тип таблицы, определенный пользователем, либо указав ее как таблицу со всеми ее столбцами.

Предположим, у вас есть UDT, подобный этому:

create type dbo.intList as table
(
    val int 
) 

вы можете объявить переменную этого типа, и это будет табличная переменная, содержащая единственный столбец int с именем val:

declare @MyIntsTable As dbo.intList

Или вы можете объявить табличную переменную следующим образом:

declare @MyIntsTable as table
(
    val int 
)

Однако я не думаю, что вам нужно использовать табличную переменную в этой ситуации.Мне кажется, что вам нужно что-то вроде этого:

BEGIN TRANSACTION

    BEGIN TRY

        DELETE 
        FROM dbo.MainJobs 
        WHERE @MainJobId =IDKey

        DELETE dbo.Relationship1 
        WHERE SubJobs IN
        (
            SELECT SubJobFamily 
            FROM dbo.Jobz 
            WHERE  JobFamily = @MainJobId
        )

        DELETE
        FROM dbo.Jobz 
        WHERE JobFamily = @MainJobId

    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
    END CATCH

IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION

Я завернул операторы удаления в транзакции, потому что я предполагаю, что вам нужны все из них для успеха, но если один из них не удается, вы хотите, чтобы всепотерпеть неудачу.

0 голосов
/ 20 февраля 2019

Это будет сделано в 2 этапа.

Сначала создайте набор требуемого идентификатора в строке через запятую, а затем на основе каждого значения в строке удалите всю запись из справочных таблиц.

Для создания строки, разделенной запятыми, вы можете использовать 'stuff' или 'coalesce' .

    DELETE FROM dbo.MainJobs WHERE  @MainJobId =IDKey
    declare @subjob nvarchar;
    SET @subjob = (SELECT SubJobFamily FROM dbo.Jobz where  JobFamily = @MainJobId ) -- use stuff or coalesce to get your result in comma separated string then use t-sql to delete your record
    Delete dbo.Jobz where JobFamily = @MainJobId
    DELETE dbo.Relationship1 where SubJobs =  @subjob  -- use t-sql over there

Или

Другой вариантиспользуется курсор для извлечения каждой записи в цикле и выполнения необходимых действий из этой записи.

    DELETE FROM dbo.MainJobs WHERE  @MainJobId =IDKey
    declare @subjob nvarchar;
    ----- use cursor over there to get each record one by one on SELECT SubJobFamily FROM dbo.Jobz where  JobFamily = @MainJobId
    SET @subjob = (SELECT SubJobFamily FROM dbo.Jobz where  JobFamily = @MainJobId ) --has mutiple values in the table
    Delete dbo.Jobz where JobFamily = @MainJobId
    DELETE dbo.Relationship1 where SubJobs =  @subjob  --deletion of multiple rows
0 голосов
/ 20 февраля 2019

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

Вы можете попробовать выполнить следующие действия, используя временную таблицу.

DECLARE @subjob NVARCHAR(20); 

SELECT subjobfamily 
INTO   #t 
FROM   dbo.jobz 
WHERE  jobfamily = @MainJobId 

DELETE dbo.jobz 
WHERE  jobfamily = @MainJobId 

DELETE dbo.relationship1 
WHERE  subjobs IN (SELECT subjobfamily 
                   FROM   #t) 
drop table #t

Также вам необходимо указать длину вашей переменной @subjob, если вы не укажете длину, она займет только первый символ.

Измените следующее объявление

declare @subjob nvarchar;

что-то вроде

declare @subjob nvarchar(100)
...