我有一个存储过程,参数有七八个,看起来很不爽。
想把它封装成一个类似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中有多少条记录。不知道是否有可行的方案?