我从存储过程(多列)返回结果集。我可以为函数(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,因为我从任意数量的表中进行选择。业务需求是如果用户具有权限(这是一个单独的主题),则使用创建报告来写入数据库中的任何表。
注意:我想将每行中的不同数据传递到存储过程中,并为每一行输出不同的数据。
答案 0 :(得分:1)
不是创建临时表(如某些注释所示),而是更改返回的结果集。
EXEC usp_Get_TwoColumnsData
WITH RESULT SETS
(
(
NewReturnedColumnName1 VARCHAR(1337) NOT NULL,
NewReturnedColumnName2 VARCHAR(1337) NOT NULL
)
)
答案 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;