[Troubleshooting][SQL Server] 解決在 SQL Server 無法使用 OPENROWSET 執行 stored procedure 的問題

這是今天在處理 SQL Server 查詢需求時的一個問題,我在資料庫中有寫了好幾支的 stored procedure,但這次要拿 stored procedure 的結果再做運算,且會和其他 stored procedure 的結果做關聯,因此我查了一下網路,找到一篇 StackOverflow.com 中的討論,說可以使用 OPENROWSET 解決這個問題...

這是今天在處理 SQL Server 查詢需求時的一個問題,我在資料庫中有寫了好幾支的 stored procedure,但這次要拿 stored procedure 的結果再做運算,且會和其他 stored procedure 的結果做關聯,因此我查了一下網路,找到一篇 StackOverflow.com 中的討論,說可以使用 OPENROWSET 解決這個問題,所以我寫了這樣的查詢句:

SELECT * INTO #temptable FROM OPENROWSER(
      'SQLNCLI',
      'Server=.; Database=mydb; Trusted_Connection=yes;',
      'EXEC dbo.myproc 1, 2, 3') q

一跑,出現了下列錯誤訊息:

訊息 7357,層級 16,狀態 2,行 1
無法處理物件 "EXEC dbo.myproc 1, 2, 3"。連結伺服器 "(null)" 的 OLE DB 提供者 "SQLNCLI" 指出物件沒有資料行,或是目前的使用者沒有使用該物件的權限。

見鬼了,明明使用的是 sysadmin 的帳戶權限,怎麼可能會沒有權限呢,而且這指令移到 SSMS 中執行是正常的啊?後來我又翻閱了幾篇文章,發現要跑 stored procedure,必須要加上 SET FMTONLY OFF,而且如果 stored procedure 在一開始的指令不會回傳任何資料的話,還要再加上 SET NOCOUNT ON,於是我把指令改成:

SELECT * INTO #temptable FROM OPENROWSER(
      'SQLNCLI',
      'Server=.; Database=mydb; Trusted_Connection=yes;',
      'SET NOCOUNT ON; SET FMTONLY OFF; EXEC dbo.myproc 1, 2, 3') q

試跑後正常,搞定收工。

Reference:

StackOverflow: How to SELECT * INTO [temp table] FROM [stored procedure]

SQL Server Books Online: SET FMTONLY

SQL Server Books Online: SET NOCOUNT