2017-04-14 107 views
1

我对T-SQL相当陌生,目前我正在为存储过程使用输入参数而挣扎。T-SQL自定义数据类型作为存储过程的输入参数

我想将SalesAreas的列表传递给我的存储过程。 A SalesArea可以有几个countryIds和一些bool值,想象一下C#中的一个类。

我开始创建自己的数据类型,将其传递到存储过程:

CREATE TYPE tIdList AS TABLE 
(
    ID INT NULL 
); 
GO 

CREATE TYPE tSalesArea AS TABLE 
(
    CountryIds tIdList NULL, 
    IsLargeClient BIT NULL, 
    IsSmallClient BIT NULL, 
); 
GO 

在存储过程中我想在tSalesAreas列表传递:

@SalesAreas tSalesArea READONLY 

问题:我无法使用我的tIdList作为tSalesArea的数据类型。

如果我插入2个销售区域(1:3,5 countryIds; 2:countryId 7),这将是这个样子:

Id | SalesAreaId | CountryId 
---+-------------+----------- 
1 |  1  |  3 
2 |  1  |  5 
3 |  2  |  7 

你知道如何解决这个问题?

谢谢!

回答

1

在sql server中不能使用表类型作为列(它是一个表类型)。

取而代之的是,创建tSalesArea,其中包含表示所需输入的列。

create type tSalesArea as table (
    SaleAreaId int not null 
    , CountryIds int not null 
    , IsLargeClient bit null 
    , IsSmallClient bit null 
); 
+0

您也可以传入XML参数作为表的替代。 –

+2

@JohnEisbrener或Json,或者你必须解析的字符串......总是有其他选择。但是,表值参数在语义上更合适,并且_usually_表现得比其他选项好得多。 – SqlZim

相关问题