0

我正在尝试编写一个 SQL 脚本,该脚本将通过一个带有新创建的 FK 的表,并使用外部表中的新行预先填充键。我不是 100% 知道如何做到这一点,或者它是否可能在一个单一的声明中,但这是我的尝试:

UPDATE [dbo].[Blogs]
set AuthorSecurableId = inserted.Id
FROM  [dbo].[Blogs] updating
INNER JOIN 
    (INSERT INTO [dbo].[Securables] (Name) 
     OUTPUT Inserted.id, ROW_NUMBER() OVER (ORDER BY Inserted.Id) as rownum
        SELECT 'Admin : ' + Name
        FROM Blogs
        WHERE AuthorSecurableId is null) inserted ON ROW_NUMBER() OVER (ORDER BY updating.Id) = inserted.rownum 
WHERE updating.AuthorSecurableId is null

当我这样做时,我收到以下错误

消息 10727,级别 15,状态 1,第 5 行
嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句不允许在 JOIN 或 APPLY 运算符的任何一侧。

下面是我拥有的架构的简单视图

在此处输入图像描述

我想为每个没有安全对象的博客创建一个安全对象,并使用新创建的安全对象填充AuthorSecurableIdID博客

我想我可以用游标来做到这一点,但我想知道是否有更好的单语句方法

4

1 回答 1

2

您可以使用合并反对Securables输出到表变量或临时表,并单独更新反对Blogs.

declare @T table
(
  SecID int,
  BlogID int
);

merge Securables T
using (
      select 'Admin : '+B.Name as Name, B.Id
      from Blogs as B
      where B.AuthorSecurabledId is null
      ) as S
on 0 = 1
when not matched by target then
  insert (Name) values (S.Name)
output inserted.Id, S.Id
  into @T;

update Blogs
set AuthorSecurabledId = T.SecID
from @T as T
where Blogs.Id = t.BlogID;

SQL小提琴

于 2013-05-27T11:19:42.793 回答