我的问题:在SQL Server 2008中是否可以在存储过程中定义时态表并将其作为变量传递给用户定义的函数?
我需要做以下事情:
我有程序dbo.GetMsgCntData
。
此过程正在进行一些计算,作为此过程的结果,我将数据放入此过程(GetMsgCntData
)中定义的临时表中:
-- table defined in dbo.GetMsgCntData
DECLARE @tmpTable TABLE (
ID BIGINT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
UserType varchar(50),
SenderID bigint,
IsArchive bit
)
因此,@tmpTable
包含一些数据。
我需要运行用户定义的函数GetCnt(@status, @MsgTempTable)
,但我需要getCnt
函数来访问@tmpTable
数据。基本上我需要这样的东西:
-- to be written at the end of dbo.GetMsgCntData
SELECT cnt(*) total,
dbo.GetCnt('open', @tmpTable) as opened,
dbo.GetCnt('closed', @tmpTable) as closed
FROM @tmpTable
-- where @tmpTable is temporal table
我尝试将@table
中的GetCnt
定义为用户定义的类型。
CREATE TYPE dbo.tmp_Messages AS TABLE (
ID BIGINT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
UserType varchar(50),
SenderID bigint,
IsArchive bit
)
CREATE FUNCTION FUNCTION [dbo].[GetCnt] (
@Status nvarchar(10),
@MsgTempTable dbo.tmp_Messages READONLY
)
....
但是这给了我错误信息:
Operand type clash: table is incompatible with tmp_Messages
我认为我的想法完全不正确。
答案 0 :(得分:2)
临时表与用户定义的类型不兼容。 您应该将临时表声明为用户定义的类型:
CREATE TYPE dbo.tmp_Messages AS TABLE
(
ID BIGINT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
UserType varchar(50),
SenderID bigint,
IsArchive bit
)
GO
--function declaration
CREATE FUNCTION [dbo].[GetCnt] (
@Status nvarchar(10),
@MsgTempTable dbo.tmp_Messages READONLY
)...
-- table defined in dbo.GetMsgCntData
DECLARE @tmpTable dbo.tmp_Messages;
INSERT INTO @tmpTable(---some actions
SELECT cnt(*) total,
dbo.GetCnt('open', @tmpTable) as opened,
dbo.GetCnt('closed', @tmpTable) as closed
FROM @tmpTable
请阅读一篇关于表值参数的好文章:http://beyondrelational.com
答案 1 :(得分:1)
您可以使用用户定义的表类型来实现此目的。试试这个
CREATE TYPE T1Type
AS TABLE (ID BIGINT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
UserType varchar(50),
SenderID bigint,
IsArchive bit
)
在你的SP中
DECLARE @tmpTable T1Type
INSERT INTO @tmpTable
SELECT * FROm TableName
在你的功能中
CREATE FUNCTION FUNCTION [dbo].[GetCnt] (
@Status nvarchar(10),
@MsgTempTable T1Type READONLY
)