我的要求是創建一個全域臨時表并在其中存盤我稍后會訪問的資料。我給我的全域臨時表一個動態名稱,并得到錯誤
無效的物件名稱“##Tmp1_84”。
84 是@SPID
這是我的腳本。請看一下并告訴我要在代碼中糾正什么以消除運行時錯誤Invalid object name '##Tmp1_84'
CREATE Proc USP_GetValuationValue
(
@Ticker VARCHAR(10),
@ClientCode VARCHAR(10),
@GroupName VARCHAR(10)
)
AS
DECLARE @SPID VARCHAR(MAX)
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) NCHAR(10);
SELECT @SPID=CAST(@@SPID AS VARCHAR)
SET @SQL = N'SELECT * INTO ##Tmp1_' @SPID ' FROM (SELECT min(id) ID,f.ticker,f.ClientCode,f.GroupName,f.RecOrder,' STUFF((SELECT N',' @CRLF N' '
N'MAX(CASE FieldName WHEN ' QUOTENAME(FieldName,'''') N' THEN FieldValue END) AS ' QUOTENAME(FieldName)
FROM tblValuationSubGroup g
WHERE ticker=@Ticker AND ClientCode=@ClientCode AND GroupName=@GroupName
GROUP BY FieldName
ORDER BY MIN(FieldOrder)
FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,10,N'') @CRLF
N'FROM (select * from tblValuationFieldValue' @CRLF
N'WHERE Ticker = ''' @Ticker ''' AND ClientCode = ''' @ClientCode ''' AND GroupName=''' @GroupName ''') f' @CRLF
N'GROUP BY f.ticker,f.ClientCode,f.GroupName,f.RecOrder) X';
--EXEC sys.sp_executesql @SQL
EXEC(@SQL)
EXEC('select * from ##Tmp1_' @SPID ' ORDER BY Broker')
EXEC('DROP TABLE IF EXISTS ##Tmp1_' @SPID)
uj5u.com熱心網友回復:
喬治已經提到了為什么您的嘗試在他們的答案中不起作用,所以我不打算談這個。
相反,我將解決這個問題,我在評論中談到了這個問題。事實上,不需要(全域)臨時表,您只需SELECT ... INTO它然后SELECT從它;您沒有進行進一步的轉換,使其毫無意義。因此,您首先可以只SELECT存盤資料,不需要臨時表。
我還解決了您的注射問題;這是一個致命的缺陷。動態 SQL 接受引數,您必須使用它們;不使用引數而是使用注入會給您帶來各種錯誤和安全問題。
我無法對此進行測驗,但我懷疑這會起作用。如果沒有,請使用您最好的朋友對我錯過的任何位除錯和傳播對動態 SQL 的修復(或提供我們可以使用 MRE 在上面運行的代碼)。
CREATE Proc USP_GetValuationValue
(
@Ticker VARCHAR(10),
@ClientCode VARCHAR(10),
@GroupName VARCHAR(10)
)
AS
BEGIN
DECLARE @SPID VARCHAR(MAX), --Is this even used now?
@SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) NCHAR(10);
SELECT @SPID=CAST(@@SPID AS VARCHAR);
SET @SQL = N'SELECT * FROM (SELECT min(id) ID,f.ticker,f.ClientCode,f.GroupName,f.RecOrder,' STUFF((SELECT N',' @CRLF N' '
N'MAX(CASE FieldName WHEN ' QUOTENAME(FieldName,'''') N' THEN FieldValue END) AS ' QUOTENAME(FieldName)
FROM tblValuationSubGroup g
WHERE ticker=@Ticker AND ClientCode=@ClientCode AND GroupName=@GroupName
GROUP BY FieldName
ORDER BY MIN(FieldOrder)
FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,10,N'') @CRLF
N'FROM (select * from tblValuationFieldValue' @CRLF
N'WHERE Ticker = @Ticker AND ClientCode = @ClientCode AND GroupName= @GroupName) f' @CRLF
N'GROUP BY f.ticker,f.ClientCode,f.GroupName,f.RecOrder) X' @CRLF
N'ORDER Y Broker;';
--PRINT @SQL; --YOur best friend
--EXEC sys.sp_executesql @SQL --Why did you comment this out? This is correct!
EXEC sys.sp_executesql @SQL, N'@Ticker varchar(10), @ClientCode varchar(10), @GroupName varchar(10)', @Ticker, @ClientCode, @GroupName
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492728.html
