【发布时间】:2010-10-26 00:01:40
【问题描述】:
我在表中有一个 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 有什么我不知道的限制吗?
附: BigNvarcharValue 是 NVARCHAR(MAX) 并且 TableName 是 NVARCHAR(50)
【问题讨论】:
-
BigNvarcharValue和TableName的SQL类型是什么?另外,您为什么要以这种非常不寻常的方式进行更新? -
听起来问题出在 C# 代码
-
SqlParameter 上设置的 size 属性是什么
-
@Conrad - 我尝试将其设置为所有内容 - 4000、8000、Int32.MaxValue,同样的问题......让我抓狂的是,如果我执行所有单元测试,单元测试就会通过批量(具有相同的精确设置!)如果我自己执行它会抛出......可能会像这样失去我所有的头发......
-
@Andrew - BigNvarcharValue 是 NVARCHAR(MAX),TableName 是 NVARCHAR(50)。如果不使用动态 sql,您将如何只有 1 个存储过程来更新表中的所有列?
标签: sql-server tsql case-when