【问题标题】:SQL String or binary data would be truncated. while inserting into table type parameterSQL 字符串或二进制数据将被截断。在插入表类型参数时
【发布时间】:2017-05-05 12:03:17
【问题描述】:

我有一个场景,其中有一个表,我需要在其中一个存储过程中传递表值参数来执行某些操作。基本表结构如下。

CREATE TABLE [dbo].[CitytTax] (
    [CountryCode] [int] NOT NULL,
    [TaxType] [varchar](255) NULL
) 

如您所见,Taxtype 列是 varchar 类型,最多占用 255 个字符。但是,我将在应用程序代码的一部分中创建如下表类型,并将此表类型作为参数传递给 sp。

DECLARE @TaxDetails as [CitytTax]

现在我将在其中插入一些虚拟值并将此表类型传递给其中一个 SP。

INSERT INTO @TaxDetails ([CountryCode],TaxType )
VALUES (6047,'Codfggtuioanoio charge to fund the liquidation of insurancevalues')

但出现如下错误:

字符串或二进制数据将被截断

这里的问题是表值类型有一个类似于实际数据库表的列。所以当我插入上面的脚本时,它失败了。但是,如果我向 [taxtype] 插入任何少于 50 个字符的值,它将成功插入。但超过 50 个字符失败。我想知道为什么它会失败,它应该最多需要 255 个字符吗?

【问题讨论】:

  • 你确定这些是唯一被插入的值吗?
  • 你有CREATE TYPE [dbo].[CitytTax] AS TABLE 吗?这是什么?
  • 我不喜欢 sql-server 但这可能与 ASCII/Unicode 等问题有关。切换到 unicode(使用 nvarchar)并检查您的数据库架构/排序规则。抱歉,如果没有帮助,请参阅例如stackoverflow.com/questions/144283/…
  • 进入SP的参数如下:@TaxDetails as [CitytTax] ReadOnly,这里这个参数的类型与现有数据库表CitytTax相同。
  • CREATE TABLE 不是声明用户定义表类型的方式,您向我们展示的其他代码示例似乎正在使用这种方式。那么你能告诉我们 Table 类型的 actual 定义吗?

标签: sql sql-server-2008 database-design


【解决方案1】:

如果您的数据长度确实短于字段长度。然后你有另一个表被主表上的触发器填充,其中列大小也必须更改。

另外,将插入查询的所有单引号替换为双引号并将其传递到存储过程中。

【讨论】:

  • 它已与 ANSI_WARNIGS OFF 一起使用。我给了一个SP,一个不完整....您也可以在这里参考其他案例:raresql.com/2014/01/03/…
【解决方案2】:

好吧,我想出了一个快速修复的方法:刚刚在插入查询之前添加了以下行:

设置 ANSI_WARNINGS 关闭。

【讨论】:

  • 这不是解决办法。那就是把你的手指伸进你的耳朵并大喊LA LA LA I CAN'T HEAR YOU。截断仍然会发生,你现在只是“高兴地”忽略了这个事实。
  • 成功了。我给了一个SP,一个不完整....您也可以在这里参考其他案例:raresql.com/2014/01/03/…
  • 我再次告诉你,这只是我发现的一个快速修复......即使我不会接受这是一个最终修复。
  • 您仍然需要向我们展示您是如何创建表格类型的,您的CREATE TABLE 代码不是表格类型,它完全不同(大小正确,可能与类型不同)。
  • 这是表类型的问题,在修改表类型变量中的列大小后解决
猜你喜欢
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多