创建存储过程以查询尚不存在的表

时间:2017-07-11 17:39:27

标签: sql sql-server stored-procedures

正如标题所说,我需要创建一个存储过程,它将创建临时表,查询临时表,并从中返回一列。问题是为了填充临时表,我需要传入一个用户将在运行时声明的参数。这是我一直在尝试的代码:

USE GameDayReporting;
GO
CREATE PROCEDURE uspGetPercentOfSection @EventID nvarchar(50)
AS 
SELECT * INTO #temp
    FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;' 
   ,'set fmtonly off exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID') 


SELECT PctCap FROM #temp

GO

PctCapuspGetEventKillSheetDetailedReport中的一列,但SQL无法识别它,因为临时表未被创建,因为我没有{{1}的用户输入}。

我们考虑将EventID初始化为0,但我相信当我们实际传入有效的EventID时,它会在创建临时表之前被覆盖为0。

为一个非常可怕的措辞问题做好准备(我不知道如何以任何其他方式问这个问题哈哈):

我应该如何重写此存储过程以从单独的存储过程的结果创建临时表,该存储过程需要一个我还没有的参数?

错误讯息:

EventID

1 个答案:

答案 0 :(得分:1)

OPENROWSET不处理变量,您需要使用动态SQL并解析输入变量。

DECLARE @SQL VARCHAR(max)
SET @SQL = 
'SELECT * INTO #temp
        FROM OPENROWSET (''SQLOLEDB'',''Server=(local);TRUSTED_CONNECTION=YES;'' 
       ,''set fmtonly off exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID =''' + @EventID + ''')'

PRINT @SQL
--EXEC (SQL)

<强>更新

我猜这是scope的问题,你可以做的是:

首先创建#temp,然后使用insert into #temp代替SELECT INTO #temp,值得一试

OR

使用global temporary tables,例如##temp

第二次更新:

由于您首先要创建#temp,现在需要:

DECLARE @SQL VARCHAR(max)
SET @SQL = 
'INSERT INTO #temp
        FROM OPENROWSET (''SQLOLEDB'',''Server=(local);TRUSTED_CONNECTION=YES;'' 
       ,''set fmtonly off exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID =''' + @EventID + ''')'

--PRINT @SQL   
EXEC (SQL) --comment this line in if that @SQL is valid