为什么UPDATE .WRITE()仅在我使用[column] .WRITE()时才有效,而不是[table].[column] .WRITE()?

w12*_*128 4 t-sql sql-server

我正在执行UPDATE .WRITE()语句,并且发现它显然只有在你定义它时才有效:

string sql = "UPDATE [dbo].[Table] SET [Column].WRITE(@data, @offset, @count) WHERE ...";
...
sqlCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用[dbo].[Table].[Column].WRITE(...)or [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()
   ...
Run Code Online (Sandbox Code Playgroud)

这是为什么?它似乎与构造SQL语句的通常方式非常一致.这个看似异常的约定是否有任何意义,显然不允许您明确指定表名和模式?

Dam*_*ver 7

它似乎不太一致......

它实际上与该SET条款的其余部分一致:

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 ] 
Run Code Online (Sandbox Code Playgroud)

也就是说,在子句中,在赋值的左侧指定表或模式永远不会有效SET(当然,您可以expression在右侧的s中通过全名或别名引用其他表).要更新的表已经在UPDATE和之间确定SET.