Moja Scenariusz
Pracuję nad bazą danych, która będzie zawierać wiele szczegółów z różnych procedur przechowywanych w różnych bazach na terenie całego serwera. Informacje, które próbuję teraz zebrać, brzmią: "Co to jest wynik SP?"Korzystanie OPENROWSET dynamicznie pobierać wyników SP przy SP zawiera # tabele tymczasowe
Podczas wyszukiwania stwierdziłem, że odpowiedź leży w OPENROWSET. Moje pierwsze testy zakończyły się sukcesem i wszystko wyglądało świetnie. Jednak po przetestowaniu go za pomocą live SPs natknąłem się na jeden poważny problem: nie działa dobrze z tabelami temp (#).
Na przykład:
Gdybym miał podjąć tę SP:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
mogę łatwo wstawić wyjście do temp (##) tabeli z następującego kodu, a następnie kwerendy sysobjects tempdb i utworzyć listę kolumn i ich typy danych:
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
Świetnie! Jednakże, jeśli SP był to zamiast:
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
Kiedy wykonać ten sam kod OPENROWSET
jak przed otrzymuję następujący błąd:
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.
Kiedy przyciąć dół kod OPENROWSET (usuwając dynamiczny rzeczy) to:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
otrzymuję następujący (znacznie bardziej użyteczne) błąd:
Invalid object name '#T'.
To tam uderzyłem w ścianę. W moich poszukiwaniach wydaje mi się, że nie ma rozwiązania, ale nie mogłem się zmusić, żeby się jeszcze poddać.
A więc mam doprowadził do ..
Moje pytanie do was
Czy ktoś świadomy jakikolwiek sposób obejścia tego błędu? A może istnieje alternatywne rozwiązanie?
Proces ten nie będzie działał często, więc nie muszę się martwić zbytnio o wydajność rozwiązania.
Wszelkie dane wejściowe będą bardzo mile widziane.
Dzięki, Zok
PS: Przepraszam za formatowania. Nie bardzo zrozumiałem tagi językowe.
Myślę, że mogłem znaleźć ołów, który wymaga użycia SET NOCOUNT ON. Dodając go do mojego manekina SP zadziałało, ale nie dla tego, którego faktycznie będę używał (który faktycznie już miał tę linię).Będę nadal bawiła się z tym i relacjonowała, co znajdę. –
W tym samym przewodzie, o którym wspomniałem powyżej, musieli wprowadzić No Op do SP. Zastanawiałem się nad stworzeniem procedury pośredniej, która parsowałaby SP, z którego próbujemy zbierać szczegóły (poprzez syscomments), wyciągając definicję tabeli tymczasowej, aby dynamicznie tworzyć No Op, ale widzę wiele problemów, które byłyby trudne do pracy na około. Soooooo, wciąż jestem w tej samej łodzi. –
Niesamowite wysiłki podjęte przez Ciebie .... dzięki –