在MS-SQL-Management StudioSSMS中使用名为“发送”的BIT字段更改数据失败

问题描述

我不明白,为什么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]失败

message from ssms

如果列名不是“ 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语句更新。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...