【发布时间】: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