我有一个具有这种结构的表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以帮助执行我的函数。
而不是最后一列中的函数名称,我需要该函数输出。这可以通过动态查询吗?
答案 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)。