在存储过程中创建表类型的语法是什么(使用VS2010)

时间:2012-02-18 17:43:21

标签: sql sql-server-2008

我在VS2010中工作,我正在尝试在存储过程中创建一个表类型......应该非常简单。但是这不能编译:

CREATE PROCEDURE dbo.StoredProcedure1

AS

CREATE TYPE DailyPricingAndVolBySymbolType AS TABLE (TradeDate date, 
Symbol varchar(120), O smallmoney, H smallmoney, L smallmoney, C smallmoney, 
Vol big int)

GO

我确定这是一个简单的语法问题...谢谢。

编辑:我只想创建一次类型,以便在其他存储过程中使用,我不是在寻找“可重用”的sproc。感谢。

4 个答案:

答案 0 :(得分:6)

在程序外创建类型 - 它只需要创建一次,并在此后的任何时候使用:

CREATE TYPE dbo.DailyPricingAndVolBySymbolType AS TABLE (TradeDate date, 
Symbol varchar(120), O smallmoney, H smallmoney, L smallmoney, C smallmoney, 
Vol bigint)
GO

CREATE PROCEDURE dbo.StoredProcedure1
AS
declare @DailyPricingAndVolBySymbolType DailyPricingAndVolBySymbolType;
...

答案 1 :(得分:3)

您可以在存储过程中轻松创建表变量

CREATE PROCEDURE dbo.StoredProcedure1

AS

DECLARE @DailyPricingAndVolBySymbolType TABLE (TradeDate date, 
Symbol varchar(120), O smallmoney, H smallmoney, L smallmoney, C smallmoney, 
Vol bigint)

或创建 temp 表:

CREATE PROCEDURE dbo.StoredProcedure1

AS

CREATE TABLE #DailyPricingAndVolBySymbolType (TradeDate date, 
Symbol varchar(120), O smallmoney, H smallmoney, L smallmoney, C smallmoney, 
Vol bigint)

但据我所知,在程序中创建一个表 type 并没有任何意义。如果 在程序中创建一个新类型,那么外部任何人都不知道该类型。


根据您的修改:

如果 可以在存储过程中定义表类型,那么基于其他SQL Server行为,我不希望相同的类型可用a)到其他上下文,并且b)存储过程执行结束后。这与例如临时表,因此我认为它不会有用。

答案 2 :(得分:1)

你可能正在寻找一个表变量:

declare @DailyPricingAndVolBySymbolType TABLE (...

如果您真的在表格类型之后,请省略big int中的空格。您的过程只运行一次,因为如果类型已存在,则无法创建该类型。

答案 3 :(得分:1)

使用此选项创建"创建类型表"。用户的简单示例

CREATE TYPE unit_list AS TABLE (
    ItemUnitId int,
    Amount float,
    IsPrimaryUnit bit
);

GO
 CREATE TYPE specification_list AS TABLE (
     ItemSpecificationMasterId int,
    ItemSpecificationMasterValue varchar(255)
);

GO
 declare @units unit_list;
 insert into @units (ItemUnitId, Amount, IsPrimaryUnit) 
  values(12,10.50, false), 120,100.50, false), (1200,500.50, true);

 declare @spec specification_list;
  insert into @spec (ItemSpecificationMasterId,temSpecificationMasterValue) 
   values (12,'test'), (124,'testing value');

 exec sp_add_item "mytests", false, @units, @spec


//Procedure definition
CREATE PROCEDURE sp_add_item
(   
    @Name nvarchar(50),
    @IsProduct bit=false,
    @UnitsArray unit_list READONLY,
    @SpecificationsArray specification_list READONLY
)
AS


BEGIN
    SET NOCOUNT OFF     

    print @Name;
    print @IsProduct;       
    select * from @UnitsArray;
    select * from @SpecificationsArray;
END