【问题标题】:Using a Stored Procedure parameter within the From of another在另一个的 From 中使用存储过程参数
【发布时间】:2014-11-19 20:13:18
【问题描述】:

我有一个从 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 的值,但我似乎找不到这样做的方法。

谢谢。

弗兰克

【问题讨论】:

    标签: stored-procedures


    【解决方案1】:

    您只需要为此使用动态查询;

    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' 不是有效标识符。”我可以访问完整的表格列表,并且可能会采用这种方法。最终这将在 Visual Studio 中使用,因此我可以将其合并为可选列表。只是会更整洁一些,包括存储过程中的所有内容。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多