问题描述
我不明白,为什么SMSS表编辑器不能与包含BIT数据类型字段的表一起使用,该字段名为“发送”,例如
CREATE TABLE [dbo].[test_fehler](
[id] [int] IDENTITY(1,1) NOT NULL,[name] [nvarchar](100) NOT NULL,[send] [bit] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[test_fehler] ADD CONSTRAINT [DF_test_fehler_send] DEFAULT ((0)) FOR [send]
可以插入行。在现有行中使用表编辑器更改[name]失败
如果列名不是“ send”,则可以正常工作。很奇怪
解决方法
这是SSMS中的错误!使用DML语句进行更新。
错误似乎集中在以下事实上:“ SEND”是TSQL中的一种保留字-它不在标准列表中,而是与“ RECEIVE”一起用于Service Broker。
SSMS似乎以微不足道的方式处理它。您可以看到如果打开SQL Server Profiler并捕获SSMS试图执行的语句会发生什么情况。
这是我在探查器中捕获的示例,其中我将行名命名为“ a”,ID为“ 1”。
EXEC sp_executesql N'UPDATE TOP (200) test_fehler SET name = @name WHERE (id = @Param1) AND (name = @Param2) AND (''send'' = @Param3)',N'@name nvarchar(1),@Param1 int,@Param2 nvarchar(1),@Param3 bit',@name = N'f',@Param1 = 1,@Param2 = N'a',@Param3 = 0
您可以看到发送的SSMS“知道”是特殊的,但是使用'进行转义,这就是为什么您得到错误代码的原因。
现在看看如果我改用“ update”作为列名会发生什么。列是保留字:
EXEC sp_executesql N'UPDATE TOP (200) test_fehler SET name = @name WHERE (id = @Param1) AND (name = @Param2) AND ([update] = @Param3)',@Param3 = 0
这里的列名被[]转义,操作成功!
如果使用“ receive”作为列名,则会出现相同的错误:
EXEC sp_executesql N'UPDATE TOP (200) test_fehler SET name = @name WHERE (id = @Param1) AND (name = @Param2) AND (''receive'' = @Param3)',@Param3 = 0
答案是更改列名,或使用DML语句更新。