Обновление SQL на основе подзапроса

#sql #sql-server #tsql

Вопрос:

У меня возникли проблемы с этим заявлением SQL, чтобы пойти и обновить некоторые записи, которые уже существуют. Для краткости я использую жестко закодированные значения.

Я хочу сделать следующее: Когда в таблице PersonXNotifyUser уже есть запись, в которой идентификатор пользователя и идентификатор уведомления совпадают, я хочу убедиться, что я обновил столбец IsDeleted до значения 0, а также обновил столбцы ModifiedBy и ModifiedDate соответственно. Вот что у меня есть до сих пор, что не выполняется, но я надеюсь, что кто-нибудь сможет мне помочь:

ОБНОВЛЕНИЕ: Поскольку в одном из ответов предполагалось, что необходим подзапрос, я добавил Тип таблицы и определение хранимой процедуры, в котором ожидается параметр с табличным значением

 CREATE TYPE dbo.GuidIDList
AS TABLE
(
    ID [UNIQUEIDENTIFIER]
);

CREATE PROCEDURE [dbo].[PersonXNotifyUser_InsertUpdate]
(
    ,@UserID [UNIQUEIDENTIFIER]
    ,@NotifyUserIDs AS dbo.GuidIDList READONLY
    ,@EditingUserID [UNIQUEIDENTIFIER]
)
AS
SET NOCOUNT ON

UPDATE PersonXNotifyUser
SET IsDeleted = 0, ModifiedBy = @EditingUserID, ModifyDate = GETUTCDATE()
FROM (
    SELECT
        test.NotifyUserID
    FROM (
        SELECT ID FROM @NotifyUserIDs
    )
    AS test (NotifyUserID)
    WHERE EXISTS
      (SELECT PersonXNotifyUserID
       FROM PersonXNotifyUser pnu
       WHERE pnu.UserID = @UserID AND pnu.NotifyUserID = test.NotifyUserID
      )
)
 

Комментарии:

1. Что это doesn't execute значит ? Пожалуйста, укажите некоторые примеры данных и ожидаемый результат

Ответ №1:

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

 DECLARE @UserID UNIQUEIDENTIFIER = '45D9F7E4-E111-4E62-8B1A-118F7C7FB6A1'
DECLARE @EditingUserID UNIQUEIDENTIFIER = 'CDFDBD9A-87FB-4F68-B695-F4A39424C207'

UPDATE PersonXNotifyUser
    SET
        IsDeleted = 0, 
        ModifiedBy = @EditingUserID, 
        ModifyDate = GETUTCDATE()
        WHERE UserID = @UserID 
            AND EXISTS
            (
                    SELECT
                        1
                        FROM @NotifyUserIDs
                            WHERE ID = PersonXNotifyUser.NotifyUserID
            )
 

Комментарии:

1. Я обновил свой вопрос, чтобы внести больше ясности. Я отклонил это для краткости, но, похоже, это добавило путаницы.

2. @blgrnboy, Но я не вижу, чтобы табличная переменная NotifyUserIDs использовалась где-либо в вашем коде