正如标题所说,我需要创建一个存储过程,它将创建临时表,查询临时表,并从中返回一列。问题是为了填充临时表,我需要传入一个用户将在运行时声明的参数。这是我一直在尝试的代码:
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
PctCap
是uspGetEventKillSheetDetailedReport
中的一列,但SQL无法识别它,因为临时表未被创建,因为我没有{{1}的用户输入}。
我们考虑将EventID
初始化为0,但我相信当我们实际传入有效的EventID
时,它会在创建临时表之前被覆盖为0。
为一个非常可怕的措辞问题做好准备(我不知道如何以任何其他方式问这个问题哈哈):
我应该如何重写此存储过程以从单独的存储过程的结果创建临时表,该存储过程需要一个我还没有的参数?
错误讯息:
EventID
答案 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