【问题标题】:Pass a table name to a stored procedure's into statement将表名传递给存储过程的 into 语句
【发布时间】:2015-07-16 00:28:56
【问题描述】:

我正在尝试将表名传递给以下代码,但它不起作用。当我这样做时,代码将起作用:SELECT X.* INTO dbo.RiskFactors_Tobacco 但我似乎无法让它起作用:SELECT X.* INTO @RiskFactorsTable。有什么建议吗?

CREATE TYPE typeRiskFactorsTable AS TABLE 
    (RiskFactorICD9 VARCHAR(10)) 

CREATE PROCEDURE dflt.GetRiskFactors 
    @RiskFactorICD9 typeRiskFactorsTable READONLY
    @RiskFactorsTable as VARCHAR(30)
AS

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '2014-01-01 00:00:00'  
SET @EndDate = '2015-12-31 23:59:59'    

SELECT X.* 
INTO @RiskFactorsTable
FROM 
    (SELECT c.id, ip.AdmitDateTime as DateTime, ip.ICD9Code, ip.ICD9Description, 'IP' as DS
        FROM dbo.Inpat ip
            INNER JOIN dbo.COHORT c ON (c.ID = ip.ID)
            WHERE ip.ICD9Code IN (SELECT RiskFactorICD9 FROM @RiskFactorICD9)
                AND ip.AdmitDateTime between @StartDate and @EndDate 
    UNION ALL
        SELECT c.id, ov.VisitDateTime as DateTime, ov.ICD9Code, ov.ICD9Description, 'OP' as DS
        FROM dbo.Outpat_Visit ov 
            INNER JOIN dbo.Outpat ovd ON (ovd.ID = ov.ID)
            INNER JOIN dbo.COHORT sc ON (c.ID = ov.ID)
            WHERE icd.ICD9Code IN (SELECT RiskFactorICD9 FROM @RiskFactorICD9)
                AND  ov.VisitDateTime between @StartDate and @EndDate  
    ) X
    ORDER BY ID, DateTime, DS
GO

/*TOBACCO*/
DECLARE @RiskFactors typeRiskFactorsTable
INSERT @RiskFactors(RiskFactorICD9) 
    VALUES  ('305.1'), ('989.84'), ('V15.82');
EXEC dflt.GetRiskFactors @RiskFactors, @RiskFactorsTable = RiskFactors_Tobacco;
GO

【问题讨论】:

  • 表名不能在 t-sql 中参数化。如果必须,唯一的方法是使用动态 sql。当心小鱼饵桌。

标签: tsql


【解决方案1】:

就像Zohar在评论中指出的那样,表名不能参数化。此外,如果您正在考虑它,您也不能将表值参数用于“select into”。

来自MSDN on the INTO clause

您不能将表变量或表值参数指定为新表。

您需要“选择进入”吗?你能做一个“INSERT INTO DestinationTable SELECT ... FROM OriginationTable”吗?如果你能做到这一点,那么表值参数应该可以工作。 INTO 子句仅用于当您希望 select 语句同时创建一个新表并插入其中时。

【讨论】:

  • 我基本上想对我的所有风险因素、烟草、COPD、低血压等使用通用存储过程。我需要一种方法来创建包含每个风险因素记录的表。我愿意接受建议。
  • @g83: read this
【解决方案2】:

在程序体中:

DECLARE @RiskFactorsTable TABLE (RiskFactorsICD9 varchar(10))

然后

INSERT INTO @RiskFactorsTable
SELECT [one column]
FROM [table]

但您不能将表格作为 SP 参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多