Mam kod, który jest:
DECLARE @Script VARCHAR(MAX)
SELECT @Script = definition FROM manged.sys.all_sql_modules sq
where sq.object_id = (SELECT object_id from managed.sys.objects
Where type = 'P' and Name = 'usp_gen_data')
Declare @Pos int
SELECT @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,7500)
PRINT SUBSTRING(@Script,1,@Pos)
PRINT SUBSTRING(@script,@pos,8000)
Długość skryptu wynosi około 10 000 znaków, a ponieważ używam instrukcji print, która może pomieścić maksymalnie 8 000 znaków. Więc używam dwóch instrukcji print.
Problem polega na tym, że kiedy mam skrypt, który ma powiedzmy 18000 znaków, użyłem 3 instrukcji print.
Czy jest więc sposób, żebym mógł ustawić liczbę instrukcji print w zależności od długości skryptu?
PRINT
czy jesteś otwarty na inne alternatywy?Odpowiedzi:
Możesz zrobić
WHILE
pętlę na podstawie liczby długości skryptu podzielonej przez 8000.NA PRZYKŁAD:
źródło
SUBSTR
i spojrzeć tylko na część, z którą masz do czynienia w danym momencie i powtórzyć to lub jeśli wiesz, że za każdym razem nastąpi złamanie linii przed limitem 8k, a następnie po prostu wykonaj naWHILE
podstawie znalezienia linii przerwy.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
drukowałem swój skrypt.Wiem, że to stare pytanie, ale nie ma tu mowy o tym, co zrobiłem.
Dla mnie zadziałało następujące.
źródło
max
gdyby.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
Poniższe obejście nie używa
PRINT
instrukcji. Działa dobrze w połączeniu z SQL Server Management Studio.Możesz kliknąć zwrócony kod XML, aby rozwinąć go we wbudowanej przeglądarce XML.
Wyświetlany rozmiar jest dość hojny po stronie klienta. Przejdź do,
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
aby w razie potrzeby dostosować.źródło
<
jest zastępowany przez<
.<root>....
SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. Ciąg zostanie zawinięty w PI o nazwie „x”, ale PI nie będzie zawijany w inny element (z powoduPATH('')
).Oto, jak należy to zrobić:
Zaczerpnięte z http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
źródło
Przyszedłem do tego pytania i chciałem czegoś prostszego ... Spróbuj wykonać następujące czynności:
źródło
SELECT CAST(@STMT AS XML)
co już stwierdzono w innym komentarzu. Daje dokładnie te same dane wyjściowe i jest rzeczywiście mniej skomplikowane niż tworzenie procedury składowanej dla danych wyjściowych.Ten proc poprawnie wypisuje
VARCHAR(MAX)
parametr uwzględniający opakowanie:źródło
Chciałem użyć instrukcji print do debugowania jakiegoś dynamicznego sql, ponieważ wyobrażam sobie, że większość z was używa print z podobnych powodów.
Wypróbowałem kilka z wymienionych rozwiązań i stwierdziłem, że rozwiązanie Kelsey działa z drobnymi poprawkami (@sql to mój @script). Nb LENGTH nie jest prawidłową funkcją:
Ten kod, zgodnie z komentarzem, dodaje nowy wiersz do danych wyjściowych, ale w przypadku debugowania nie stanowi to dla mnie problemu.
Rozwiązanie Bena B jest doskonałe i najbardziej eleganckie, chociaż do debugowania jest dużo linii kodu, więc zdecydowałem się użyć mojej niewielkiej modyfikacji Kelseya. Może warto byłoby stworzyć system podobny do procedury składowanej w msdb dla kodu Bena B, który można by ponownie wykorzystać i wywołać w jednej linii?
Kod Alfoksa niestety nie działa, ponieważ byłoby to łatwiejsze.
źródło
Możesz tego użyć
źródło
Właśnie stworzyłem SP z doskonałej odpowiedzi Bena :
źródło
źródło
Istnieje świetna funkcja o nazwie PrintMax, napisana przez Bennetta Dilla .
Oto nieco zmodyfikowana wersja, która używa tymczasowej procedury składowanej, aby uniknąć „polution schematu” (pomysł z https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
DBFiddle Demo
EDYTOWAĆ:
Używając
CREATE OR ALTER
możemy uniknąć dwóch wywołań EXEC:db <> fiddle Demo
źródło
Używa znaków nowego wiersza i spacji jako dobrego punktu przerwania:
źródło
Lub po prostu:
źródło
Oto inna wersja. Ten wyodrębnia każdy podciąg do wydrukowania z głównego ciągu zamiast zmniejszać główny ciąg o 4000 w każdej pętli (co może spowodować powstanie wielu bardzo długich ciągów pod maską - nie jestem pewien).
źródło
To powinno działać poprawnie, to tylko ulepszenie poprzednich odpowiedzi.
źródło
Jeśli kod źródłowy nie będzie miał problemów z zastąpieniem LF przez CRLF, nie jest wymagane debugowanie przez wykonanie prostych kodów wyjściowych.
źródło
Moja wersja PrintMax do zapobiegania złym podziałom wierszy na wyjściu:
źródło