我在表中有一个 NVARCHAR(max) 列和一个存储过程,它将使用 CASE 切换更新此列以及表中的任何其他列:
CREATE PROCEDURE updateTable
@columnName sysname,
@value nvarchar(max)
AS
UPDATE [dbo].[TestTable]
SET
BigNvarcharValue = CASE @columnName WHEN 'BigNvarcharValue' THEN @value ELSE BigNvarcharValue END,
TableName = CASE @columnName WHEN 'TableName' THEN @value ELSE TableName END
如果我从 SQL Management Studio 执行此过程,一切都很好
EXEC [dbo].[updateTable]
@columnName = 'BigNvarcharValue',
@value = N'SOME BIG 80Kb value'
我也可以使用相同的存储过程从 C# 代码更新 TableName,但是当从 C# 更新这个 BigNvarcharValue 时,它会失败并出现 SQLException ,即“字符串或二进制数据将被截断”。现在,我认为它与此存储过程中的 CASE 有关,因为当我将其分解为更简单的存储过程时,一切正常:
CREATE PROCEDURE updateTable
@columnName sysname,
@value nvarchar(max)
AS
UPDATE [dbo].[TestTable]
SET BigNvarcharValue=@value
我阅读了一堆论坛帖子,这些帖子描述了尝试将更大的值插入 NVARCHAR 列的问题,这会导致此异常,但它似乎并不适用。
我对 T-SQL 相当陌生,那么 CASE 有什么我不知道的限制吗?
PS BigNvarcharValue 是 NVARCHAR(MAX) 并且 TableName 是 NVARCHAR(50)