我在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。感谢。
答案 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