Sql server azure sql中带有OUTPUT子句的Delete语句

Sql server azure sql中带有OUTPUT子句的Delete语句,sql-server,azure,azure-sql-database,Sql Server,Azure,Azure Sql Database,我使用DELETE语句的OUTPUT子句插入到存档表中 此代码在我的本地数据库上正常工作。但是,我在Azure数据库上运行时出错,因为列值为null 为什么Azure上的行为会有所不同 此代码: DECLARE @courseId uniqueidentifier SET @courseId = 'c7f5a926-e77a-4465-9120-38da284ed7d5' DECLARE @courseCode nvarchar(max) SELECT @courseCode = Course

我使用DELETE语句的OUTPUT子句插入到存档表中

此代码在我的本地数据库上正常工作。但是,我在Azure数据库上运行时出错,因为列值为null

为什么Azure上的行为会有所不同

此代码:

DECLARE @courseId uniqueidentifier
SET @courseId = 'c7f5a926-e77a-4465-9120-38da284ed7d5'

DECLARE @courseCode nvarchar(max)
SELECT @courseCode = CourseCode FROM Courses WHERE CourseId = @courseId

SELECT @courseId
SELECT @courseCode

-- Courses
DELETE Courses
OUTPUT DELETED.*
INTO Archived_Courses
WHERE CourseId = @courseId
返回此错误:

(1行受影响)

(1行受影响)

(1行受影响)

Msg 515,级别16,状态2,第16行无法将值NULL插入 “CourseName”列,表“…dbo.Archived_Courses”;专栏是这样的 不允许空值。插入失败。声明已终止


我做了一个repor,他在我的SQL Azure数据库上工作得非常好: 假设你有这样的东西:

Create Table Courses
(
    CourseId uniqueidentifier NOT NULL PRIMARY KEY DEFAULT newid(),
    CourseCode nvarchar(50) NOT NULL DEFAULT newid(),
    CourseDescription nvarchar(MAX) NULL
)  

Create Table Archived_Courses
(
    CourseId uniqueidentifier NOT NULL PRIMARY KEY ,
    CourseCode nvarchar(50) NOT NULL ,
    CourseDescription nvarchar(MAX) NULL
)  
这是你的解决方案,对我来说很有效(唯一的区别是,我只需在课程代码上进行简单选择即可获得唯一标识符)

您确定在本地数据库的Insert上没有生成任何Azure SQL数据库上没有的默认值吗


Sébastien

您没有向我们展示表格定义-您自己检查过吗?此外,我们没有任何数据-您确定您在本地计算机和Azure之间使用相同的表定义和足够相似的数据吗?稍后将再次检查这一点。假设Azure SQL支持带有output子句的delete语句,那么表上的其他聚集索引是否会导致此行为?您是正确的-有一个很长的列列表,其中两列的位置发生了切换。这进一步提出了一个问题,即是否在OUTPUT DELETED.*子句中指定列名-有什么想法吗?我想说的是,您应该始终在两种情况之外指定列列表-当您进行原型设计时和当您指定
EXISTS()
子查询时。列应该按名称而不是(预期的)序号位置引用。它甚至包含了一个错误(列顺序发生了变化)这个问题是因为两列的列顺序被切换了。感谢您确认OUTPUT子句在Azure上按预期工作。(我不确定您上面的示例代码是否应该为Courses.CourseCode列分配一个newid())
Insert into Courses (CourseCode, CourseDescription) values ('MOD01', 'Module 1 description');

DECLARE @courseId uniqueidentifier
Select @courseId = CourseId from Courses where CourseCode = 'MOD01'

DECLARE @courseCode nvarchar(max)
SELECT @courseCode = CourseCode FROM Courses WHERE CourseId = @courseId

SELECT @courseId
SELECT @courseCode

-- Courses
DELETE Courses
OUTPUT DELETED.*
INTO Archived_Courses
WHERE CourseId = @courseId