首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么仅当我使用[.WRITE] .WRITE()而不使用[表].[列].WRITE()时,UPDATE .WRITE()才有效?

为什么仅当我使用[.WRITE] .WRITE()而不使用[表].[列].WRITE()时,UPDATE .WRITE()才有效?
EN

Stack Overflow用户
提问于 2013-07-08 15:50:30
回答 1查看 1.4K关注 0票数 4

我正在执行一个UPDATE .WRITE()语句,并发现它显然只有在您像这样定义它时才有效:

代码语言:javascript
复制
string sql = "UPDATE [dbo].[Table] SET [Column].WRITE(@data, @offset, @count) WHERE ...";
...
sqlCommand.ExecuteNonQuery();

但是,如果我使用[dbo].[Table].[Column].WRITE(...)[Table].[Column].WRITE(...),就会抛出异常:

代码语言:javascript
复制
Incorrect syntax near 'WRITE'.

Stack trace:
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   ...

为什么会这样呢?这似乎与通常构造SQL语句的方式不太一致。这种看似例外的约定显然不允许您显式地指定表名和模式,这有什么意义吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-08 15:55:45

它看起来不是很一致...

它实际上与SET clause的其余部分是一致的

代码语言:javascript
复制
SET
    { column_name = { expression | DEFAULT | NULL }
      | { udt_column_name.{ { property_name = expression
                            | field_name = expression }
                            | method_name ( argument [ ,...n ] )
                          }
      }
      | column_name { .WRITE ( expression , @Offset , @Length ) }
      | @variable = expression
      | @variable = column = expression
      | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
      | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
      | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
    } [ ,...n ] 

也就是说,在SET子句中,在赋值的左侧指定表或模式是无效的(当然,您可以在右侧的expression中通过全名或别名引用其他表)。在UPDATESET之间已经确定了要更新的表。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17521476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档