我有一个存储过程,参数有七八个,看起来很不爽。
想把它封装成一个类似C#结构体的东西。于是我创建了一个Table valued parameter,因为这其实是一个临时表,所以我每次在使用事前,都得判断一下TVP里面有多少条记录,但是事实上有且应该只有一条记录才对。另外,因为没有类似于C#结构体中point.X这种用法,我还是必须要在存储过程里面声明一堆局部变量,然后从TVP里面将第一行的每列值Select出来。如下:CREATE PROCEDURE [dbo].[QueryCase]
(
@ParamList QueryParameter READONLY
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @p1 AS BIGINT
DECLARE @p2 AS INT
DECLARE @p3 AS NVARCHAR(10) -- We only accept one query parameter at one time.
DECLARE @ParamCnt AS INT
SELECT @ParamCnt = COUNT(*) FROM @ParamList
IF @ParamCnt = 1
BEGIN
SELECT TOP 1 @p1 = CaseId, @p2 = UserId, @p3 = UserName FROM @ParamList
SELECT * FROM Cases
WHERE
(
1=1
AND (@p1 IS NULL OR CaseId = @p1)
AND (@p2 IS NULL OR UserId = @p2)
AND (@p3 IS NULL OR UserName = @p3)
)
END
.......END但是这样看起来也相当的不爽,虽然参数列表是清爽了,但是存储过程内部多了一大堆的局部变量。
我期望的,
1,能够像C那样很方便的访问某个记录的某列数据,比如@param(1).CaseId
2,最好能有其他的更接近结构体的语义的东西来代替TVP,不需要再判断TVP中有多少条记录。不知道是否有可行的方案?
想把它封装成一个类似C#结构体的东西。于是我创建了一个Table valued parameter,因为这其实是一个临时表,所以我每次在使用事前,都得判断一下TVP里面有多少条记录,但是事实上有且应该只有一条记录才对。另外,因为没有类似于C#结构体中point.X这种用法,我还是必须要在存储过程里面声明一堆局部变量,然后从TVP里面将第一行的每列值Select出来。如下:CREATE PROCEDURE [dbo].[QueryCase]
(
@ParamList QueryParameter READONLY
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @p1 AS BIGINT
DECLARE @p2 AS INT
DECLARE @p3 AS NVARCHAR(10) -- We only accept one query parameter at one time.
DECLARE @ParamCnt AS INT
SELECT @ParamCnt = COUNT(*) FROM @ParamList
IF @ParamCnt = 1
BEGIN
SELECT TOP 1 @p1 = CaseId, @p2 = UserId, @p3 = UserName FROM @ParamList
SELECT * FROM Cases
WHERE
(
1=1
AND (@p1 IS NULL OR CaseId = @p1)
AND (@p2 IS NULL OR UserId = @p2)
AND (@p3 IS NULL OR UserName = @p3)
)
END
.......END但是这样看起来也相当的不爽,虽然参数列表是清爽了,但是存储过程内部多了一大堆的局部变量。
我期望的,
1,能够像C那样很方便的访问某个记录的某列数据,比如@param(1).CaseId
2,最好能有其他的更接近结构体的语义的东西来代替TVP,不需要再判断TVP中有多少条记录。不知道是否有可行的方案?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货