Stored procedures 在另一个存储过程的From中使用存储过程参数

Stored procedures 在另一个存储过程的From中使用存储过程参数,stored-procedures,Stored Procedures,我有一个从eForm表输出总计的存储过程。我希望使用此存储过程从其他eForm表中提取数据,因此希望用参数替换from子句中的eForm表名。我已经阅读了其他问题,但找不到一个有助于在From中使用参数的问题。此存储过程的代码如下所示- IF OBJECT_ID ('sp_SelectEformMonthlyTotals') IS NOT NULL DROP PROCEDURE sp_SelectEformMonthlyTotals GO CREATE PROCEDURE sp_Select

我有一个从eForm表输出总计的存储过程。我希望使用此存储过程从其他eForm表中提取数据,因此希望用参数替换from子句中的eForm表名。我已经阅读了其他问题,但找不到一个有助于在From中使用参数的问题。此存储过程的代码如下所示-

IF OBJECT_ID ('sp_SelectEformMonthlyTotals') IS NOT NULL
DROP PROCEDURE sp_SelectEformMonthlyTotals

GO

CREATE PROCEDURE sp_SelectEformMonthlyTotals @EFORMNAME VARCHAR (200) = ''
AS
CREATE TABLE    #TEMP (EFORMNAME VARCHAR (200))
INSERT INTO #TEMP

EXEC sp_UpdateEForm @EFORMNAME

SELECT ....

FROM @EFORMNAME T1 INNER JOIN FLODS_CASE_ENQUIRY_F00 T2 ON T1.EFORM_CASE_ENQUIRY_ID = T2.CASE_ENQUIRY_ID

WHERE    T2.CREATED_DT >= '2012-04-02'
GROUP BY MONTH(T2.CREATED_DT), YEAR(T2.CREATED_DT)) T3
ORDER BY YEAR, MONTH_NUMBER

DROP TABLE #TEMP
这是许多人的最新尝试,现在包括第二个名为sp_UpdateEForm的存储过程-

IF OBJECT_ID ('sp_UpdateEForm') IS NOT NULL
DROP PROCEDURE  sp_UpdateEForm

GO

CREATE PROCEDURE sp_UpdateEForm @EFORMNAME VARCHAR (200) = ''
AS
UPDATE FRANCIS
SET eFormName = @EFORMNAME
我创建了Francis表来保存eFormName。我可以看出,在sp_SelectEformMonthlyTotals可以完成之前,我需要设置@EFORMNAME的值,但我似乎找不到一种方法来实现这一点

谢谢


Frank

您只需使用动态查询即可

CREATE PROCEDURE sp_SelectEformMonthlyTotals @EFORMNAME VARCHAR (200) = ''
AS
CREATE TABLE    #TEMP (EFORMNAME VARCHAR (200))
INSERT INTO #TEMP

EXEC sp_UpdateEForm @EFORMNAME

DECLARE @sSQL AS VARCHAR(2000), @DateCreated as varchar(10)
SET @DateCreated = '2012-04-02'

SET @sSQL = 'SELECT .... '
SET @sSQL = @sSQL + ' FROM ' + @EFORMNAME + ' T1 INNER JOIN FLODS_CASE_ENQUIRY_F00 T2 ON T1.EFORM_CASE_ENQUIRY_ID = T2.CASE_ENQUIRY_ID '

SET @sSQL = @sSQL + ' WHERE    T2.CREATED_DT >= '' + @DateCreated + '''
SET @sSQL = @sSQL + ' GROUP BY MONTH(T2.CREATED_DT), YEAR(T2.CREATED_DT)) T3'
SET @sSQL = @sSQL + ' ORDER BY YEAR, MONTH_NUMBER'

exec @sSQL

DROP TABLE #TEMP

谢谢你。它不喜欢sSQL,所以将其改为@sSQL,然后不喜欢SQL中的单引号,所以我将Quoted_Identifier设置为Off,并将sinqle引号改为双引号,然后创建了存储过程。运行它会导致一个错误,名称“SELECT etc,etc”不是有效的标识符。更改为EXEC@sSQL导致不允许使用定义为或[]的别名,因此我遇到了一些麻烦?是的,他们遗漏了@符号,只是编辑了答案感谢更新,但仍然存在问题-名称“SELECT etc,etc”不是有效的标识符。我可以访问完整的表格列表,并可能采用这种方法。最终,这将在VisualStudio中使用,因此我可以将其合并为可选列表。如果将存储过程中的所有内容都包含在内,会更整洁一些。谢谢