Sql server 为什么UPDATE.WRITE()只在使用[column].WRITE()而不是[table].column].WRITE()时才起作用?

Sql server 为什么UPDATE.WRITE()只在使用[column].WRITE()而不是[table].column].WRITE()时才起作用?,sql-server,tsql,Sql Server,Tsql,我正在执行一个UPDATE.WRITE()语句,并发现它显然只有在您这样定义它时才起作用: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE(@data, @offset, @count) WHERE ..."; ... sqlCommand.ExecuteNonQuery(); 但是,如果使用[dbo].[Table].[Column].WRITE(…)或[Table].[Column].WRITE(…),则会引发异常: Incorr

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

string sql = "UPDATE [dbo].[Table] SET [Column].WRITE(@data, @offset, @count) WHERE ...";
...
sqlCommand.ExecuteNonQuery();
但是,如果使用
[dbo].[Table].[Column].WRITE(…)
[Table].[Column].WRITE(…)
,则会引发异常:

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语句的方式不太一致。这种看似例外的约定是否有任何意义,显然不允许您显式指定表名和模式

看起来不太一致

它实际上与以下内容一致:


也就是说,在
SET
子句中,在赋值的左侧指定一个表或模式是永远不会有效的(当然,您可以在右侧的
表达式中通过全名或别名引用其他表)。要更新的表已在
update
SET

@marc_s之间标识,我正在使用它以块的形式更新varbinary(max)列,因为它可能非常长(100MB+)。有没有其他方法可以做到这一点,因为据我所知,.WRITE是常用的方法?@marc_s根据文档,是WRITETEXT和UPDATETEXT方法将与ntext、text和image数据类型一起贬值,而不是用于varchar(max)、nvarchar(max)和varbinary(max)数据类型的WRITE方法。
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 ]