代码之家  ›  专栏  ›  技术社区  ›  kateroh

执行存储过程时发生异常,大小写从C#(T-SQL)切换

  •  1
  • kateroh  · 技术社区  · 14 年前

    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还不太熟悉,所以有没有什么我不知道的限制呢?

    P、 S.BigNvarcharValue是NVARCHAR(MAX),TableName是NVARCHAR(50)

    4 回复  |  直到 14 年前
        1
  •  1
  •   OMG Ponies    14 年前

    要处理的列的数据类型是什么?因为我试图将NVARCHAR(max)允许的值插入到VARCHAR(50)列中,从而复制了错误。

    重申一下-NVARCHAR(max)允许您指定一个比指定的数据类型长的值,这就是为什么您会得到有关截断的错误信息。

        2
  •  1
  •   Will Marcouiller    14 年前

    nvarchar(max) 能应付。

    SSMS2008具有一些调试功能,允许设置断点等。

    我想你应该注意一下 System.String

        3
  •  1
  •   Conrad Frix    14 年前

    使用完全相同的存储过程和您描述的表,我运行了以下代码

    class Program
        {
        static void Main(string[] args)
        {
    
            using(SqlConnection cnn = new SqlConnection(@"Server=.;Database=test;Trusted_Connection=True;"))
            {
                cnn.Open();
                SqlCommand cmd = new SqlCommand("updateTable",cnn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@columnName",
                       System.Data.SqlDbType.NVarChar, 128));
    
                cmd.Parameters["@columnName"].Value = "BigNvarcharValue";
    
                cmd.Parameters.Add(new SqlParameter("@value",  
                         System.Data.SqlDbType.NVarChar, -1));
                cmd.Parameters["@value"].Value = new string('T', 80000);
    
                cmd.ExecuteNonQuery();
    
    
    
            }
    
        }
    }
    

    它工作得很好。我将检查命令文本和参数集合(名称和值),并验证每个is是否如您所想。

        4
  •  0
  •   kateroh    14 年前

    谢谢大家的回复。我最终将大列的更新分离为一个单独的过程,从而解决了问题。我确信罪魁祸首和案件陈述有关。