Kịch bản của tôi
Tôi đang làm việc trên một cơ sở dữ liệu trong đó sẽ chứa nhiều chi tiết từ các Stored Procedure khác nhau trong cơ sở dữ liệu khác nhau trên toàn bộ máy chủ. Thông tin tôi đang cố gắng thu thập bây giờ là, "SP đầu ra là gì?"Sử dụng OPENROWSET để tự động lấy kết quả SP khi SP chứa # bảng tạm
Trong tìm kiếm, tôi đã tìm thấy câu trả lời nằm trong OPENROWSET. Thử nghiệm ban đầu của tôi đã thành công và mọi thứ đều tuyệt vời. Tuy nhiên, khi thử nghiệm nó với các SP trực tiếp, tôi gặp phải một vấn đề lớn: Nó không chơi tốt với các bảng tạm thời (#).
Ví dụ:
Nếu tôi được đưa SP này:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
tôi có thể dễ dàng chèn kết quả vào một temp (##) bảng với đoạn mã sau, sau đó truy vấn sysobjects tempdb và tạo danh sách các cột và loại dữ liệu của chúng:
IF OBJECT_ID('tempdb.dbo.##TempOutput','U') IS NOT NULL DROP TABLE ##TempOutput
DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT *
INTO ##TempOutput
FROM OPENROWSET(''SQLNCLI'', ''Server=' +
CONVERT(VARCHAR(100), SERVERPROPERTY('MachineName')) +
';Trusted_Connection=yes;'', ''SET FMTONLY OFF exec ' +
DB_NAME() +
'.dbo.zzTempSP @A=1, @B=2'')'
EXEC(@sql)
SELECT *
FROM ##TempOutput
Tuyệt vời! Tuy nhiên, nếu nhà cung cấp vẫn này thay vì:
CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)
INSERT INTO dbo.#T
SELECT @A AS A, @B AS B
SELECT *
FROM dbo.#T
Khi tôi thực hiện cùng OPENROWSET
mã như trước khi tôi nhận được lỗi sau:
Cannot process the object "SET FMTONLY OFF exec DatabaseName.dbo.zzTempSP @A=1,@B=2". The OLE DB provider "SQLNCLI10" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.
Khi tôi cắt xuống mã OPENROWSET (bằng cách loại bỏ các động thứ) như sau:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
tôi nhận được (nhiều hữu ích hơn) lỗi sau:
Invalid object name '#T'.
Đó là nơi tôi chạm vào tường. Trong tìm kiếm của tôi có vẻ như không có giải pháp, nhưng tôi không thể tự mình từ bỏ nó.
Và vì vậy tôi dẫn đến ..
Câu hỏi của tôi để bạn
Có ai biết về bất kỳ cách nào có thể phá vỡ được lỗi này? Hoặc là có thể có một giải pháp thay thế?
Quá trình này sẽ không chạy thường xuyên vì vậy tôi không cần phải lo lắng quá nhiều về hiệu quả của giải pháp.
Bất kỳ đầu vào nào cũng sẽ được đánh giá cao.
Xin cảm ơn, Zok
PS: Xin lỗi về định dạng. Tôi đã không hoàn toàn tìm ra các thẻ ngôn ngữ.
Tôi nghĩ rằng tôi có thể đã tìm thấy khách hàng tiềm năng liên quan đến việc sử dụng SET NOCOUNT ON. Khi thêm nó vào SP giả của tôi nó đã làm việc, nhưng không phải cho một mà tôi thực sự sẽ được sử dụng (mà thực sự đã có dòng đó).Tôi sẽ tiếp tục đùa giỡn với nó và báo cáo về những gì tôi tìm thấy. –
Trong cùng một khách hàng tiềm năng tôi đã đề cập ở trên, họ đã giới thiệu một No Op cho SP. Tôi đã xem xét việc tạo một thủ tục trung gian phân tích SP mà chúng tôi đang cố gắng thu thập chi tiết từ (thông qua syscomments), rút ra định nghĩa về bảng tạm thời để tự động tạo ra No Op, nhưng tôi thấy rất nhiều vấn đề khó làm việc xung quanh. Soooooo, tôi vẫn ở cùng một chiếc thuyền. –
Nỗ lực tuyệt vời do bạn gây ra .... cảm ơn –