SQL将存储过程的结果选择到注释中

时间:2017-10-05 15:07:59

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

我从存储过程(多列)返回结果集。我可以为函数(getContactDisplayName)中的列填充值,例如:

SELECT
    (SELECT [dbo].getContactDisplayName([Form_Response_ID])) AS Submitted_By
FROM 
    foo_Table;

我想用存储过程(sp_GetFormAnswer)做同样的事情,例如:

SELECT 
    (SELECT EXEC sp_GetFormAnswer @FieldName = 'Submission_Data') AS Answer
FROM 
    foo_Table;

这可能吗?如果是这样,为什么不呢?我有什么选择?我必须使用存储过程,因为该存储过程调用动态SQL(使用exec,函数无法执行)。

注意 - 代码已经过测试,从函数中填充列可以正常工作,就像存储过程一样。只是不在选择内。

编辑:我的实际,完整,工作,存储过程(抱歉,它不在测试数据库中):

ALTER PROCEDURE dbo.crds_sp_GetFormAnswer 
    @FieldName varchar(max), 
    @TableName varchar(max), 
    @PrimaryKeyColumnName varchar(max), 
    @DataRecordId int
AS
    DECLARE @sql nvarchar(max)

    SELECT @sql = 'SELECT ' + @FieldName +
              ' FROM ' + @TableName + 
              ' WHERE ' + @PrimaryKeyColumnName + '  =  ' + STR(@DataRecordId) + ';';

    EXEC sp_executesql @sql, 
            N'@FieldName varchar(max), @TableName varchar(max), 
              @PrimaryKeyColumnName varchar(max), @DataRecordId int', 
            @FieldName = @FieldName, @TableName = @TableName, 
            @PrimaryKeyColumnName = @PrimaryKeyColumnName, @DataRecordId = @DataRecordId;
GO

--test
EXEC crds_sp_GetFormAnswer @FieldName = 'Submission_Data', 
                           @TableName = 'cr_Submissions', 
                           @PrimaryKeyColumnName = 'Submission_ID', 
                           @DataRecordId = 15;

简而言之,我的最终目标是使用动态SQL来填充字段。我必须使用动态SQL,因为我从任意数量的表中进行选择。业务需求是如果用户具有权限(这是一个单独的主题),则使用创建报告来写入数据库中的任何表。

enter image description here

注意:我想将每行中的不同数据传递到存储过程中,并为每一行输出不同的数据。

2 个答案:

答案 0 :(得分:1)

不是创建临时表(如某些注释所示),而是更改返回的结果集。

EXEC usp_Get_TwoColumnsData
WITH RESULT SETS
(
    (
       NewReturnedColumnName1 VARCHAR(1337) NOT NULL,
       NewReturnedColumnName2 VARCHAR(1337) NOT NULL
    )
)

Output

答案 1 :(得分:1)

我将假设您发布的动态sql有效(请参阅我对OP的评论)。如果您使用的是早于2012的版本,则可以使用表变量或临时表来执行此操作。以下是使用表变量执行此操作的方法。

declare @Result table
(
    Result varchar(max) --or whatever datatype makes sense here
)

insert @Result
EXEC crds_sp_GetFormAnswer @FieldName = 'Submission_Data', @TableName = 'cr_Submissions', 
                           @PrimaryKeyColumnName = 'Submission_ID', @DataRecordId = 15;