Sql server 2008 SQL Server 2008表,数据作为UDF的参数
我的问题:在SQL Server 2008中,是否可以在存储过程中定义时态表,并将其作为变量传递给用户定义的函数 我需要做以下工作:Sql server 2008 SQL Server 2008表,数据作为UDF的参数,sql-server-2008,tsql,user-defined-functions,table-valued-parameters,Sql Server 2008,Tsql,User Defined Functions,Table Valued Parameters,我的问题:在SQL Server 2008中,是否可以在存储过程中定义时态表,并将其作为变量传递给用户定义的函数 我需要做以下工作: 我有一个过程dbo.GetMsgCntData 此过程正在进行一些计算,因此,我将数据放入在此过程中定义的临时表(GetMsgCntData): 因此,@tmpTable包含一些数据。 我需要运行用户定义的函数GetCnt(@status,@MsgTempTable),但我需要GetCnt函数来访问@tmpTable数据。基本上我需要这样的东西: -- to b
dbo.GetMsgCntData
GetMsgCntData
):
@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
GetCnt
中将@table
定义为用户定义的类型
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
我认为我的想法根本不正确。您可以使用用户定义的表类型来实现这一点。试试这个
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
)
临时表与用户定义的类型不兼容。 您应该将临时表声明为用户定义的类型:
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
请阅读一篇关于表值参数的好文章:
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