2013-07-08 15 views
4

我執行的UPDATE .WRITE()語句,並發現了它,如果你定義它像這顯然只適用:爲什麼只有使用[column] .WRITE(),而不是[table]。[column] .WRITE()時,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語句的通常方式似乎並不一致。對於這種看似罕見的約定,是否有任何意義,你顯然不允許明確指定表名和模式?

+1

@marc_s我用它來更新塊一個VARBINARY(max)列,因爲它是可能的它是非常長(100MB +)。還有另一種方法可以做到這一點,因爲據我所知,.WRITE是通常的方式? – w128

+2

@marc_s根據文檔,它是WRITETEXT和UPDATETEXT方法,它們將與ntext,text和image數據類型一起折舊,而不是用於varchar(max),nvarchar(max)的WRITE方法varbinary(最大)數據類型。 [來源](http://msdn.microsoft.com/en-us//library/ms177523.aspx#LOBValues) – jpw

回答

6

它似乎並不很一致...

它與SET clause的其餘部分實際上是一致的:

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子句來指定分配左側的表或模式(當然,您可以通過全名或別名在右側h的expression s中引用其他表和側)。要更新的表格已在UPDATESET之間進行識別。