在SELECT

时间:2016-04-13 20:21:12

标签: sql-server sql-server-2008 stored-procedures

我有一个具有这种结构的表tblDashboard

CREATE TABLE [dbo].[tblDashboard]
(
    [DashboardID] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Description] [nvarchar](2047) NOT NULL,
    [StoredProcedureName] [nvarchar](511) NULL,

    CONSTRAINT [PK_Dashboard] 
        PRIMARY KEY CLUSTERED ([DashboardID] ASC)
            WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
                  ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

对于每个仪表板项目,我都附加了一个存储过程。我必须针对仪表板项执行相应的存储过程集。

我需要的输出基本上是以下格式

SELECT 
    DashboardID, Name, 
    <stored procedure output> 
FROM 
    tblDashboard

我知道在EXEC查询中不可能有SELECT语句,而是寻找建议/替代方法来实现此输出。感谢

所有存储过程都返回nvarchar(MAX)类型的值。我应该将每个存储过程更改为函数并在SELECT查询中调用吗?

我已将存储过程更改为函数,并添加了sqlfiddle以帮助执行我的函数。

而不是最后一列中的函数名称,我需要该函数输出。这可以通过动态查询吗?

1 个答案:

答案 0 :(得分:4)

最佳解决方案是将存储过程重写为-Dsun.io.serialization.extendedDebugInfo=true 。这样你就能做到:

TVF

如果你不能这样做,如果你的存储过程只返回一个结果集,你需要声明一个表变量或一个临时表(与过程的结果集相同的布局),然后声明一个游标用于仪表板条目并附加到循环中的表:

SELECT  dashboardId, name, tvf.*
FROM    dashboard
CROSS APPLY
        my_tvf(dashboardId) tvf

然后,您需要将DECLARE cr_dashboard CURSOR FAST_FORWARD FORWARD_ONLY FOR SELECT * FROM dashboard DECLARE @id INT OPEN cr_dashboard WHILE 1 = 1 BEGIN FETCH cr_dashboard INTO @id IF @@FETCH_STATUS <> 0 BREAK INSERT INTO @tv EXEC my_sp @id END CLOSE cr_dashboard DEALLOCATE cr_dashboard @tv一起加入(前提是存储过程在某处返回结果集中的仪表板ID)。