Mam następujący kod:
Using cmd As SqlCommand = Connection.CreateCommand
cmd.CommandText = "UPDATE someTable SET Value = @Value"
cmd.CommandText &= " WHERE Id = @Id"
cmd.Parameters.AddWithValue("@Id", 1234)
cmd.Parameters.AddWithValue("@Value", "myValue")
cmd.ExecuteNonQuery
End Using
Zastanawiam się, czy jest jakiś sposób, aby uzyskać końcową instrukcję SQL jako ciąg znaków, który powinien wyglądać tak:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Jeśli ktoś zastanawia się, dlaczego miałbym to zrobić:
- do rejestrowania (nieudanych) instrukcji
- za możliwość skopiowania i wklejenia go do Enterprise Manager w celach testowych
Odpowiedzi:
Chociaż nie jest idealny, oto coś, co podrzuciłem dla TSQL - można go łatwo dostosować do innych smaków ... Jeśli nic innego nie da ci punktu wyjścia do własnych ulepszeń :)
Wykonuje to zadanie OK dotyczące typów danych i parametrów wyjściowych itp., Podobnie jak w przypadku „wykonywania procedury składowanej” w SSMS. Najczęściej używaliśmy SP, więc polecenie „tekst” nie uwzględnia parametrów itp
to generuje dane wyjściowe według tych linii ...
źródło
ToBooleanOrDefault
tutaj: Pytanie # 3244850Do celów logowania obawiam się, że nie ma lepszego sposobu na zrobienie tego niż samodzielne skonstruowanie ciągu:
źródło
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
zastąpienia parametrów w ciągu. Zastąpi to „całe słowo”. Może to nie być uniwersalne rozwiązanie, ponieważ \ b oznacza pozycję między znakiem słowa a znakiem innym niż słowo, więc w przypadku gdy nazwy parametrów zaczynają się od @, należy użyćp.ParameterName + @"\b"
parametru zastępującego parametr w ciągu zapytania.Nie możesz, ponieważ nie generuje żadnego SQL.
Sparametryzowane zapytanie (jedno w
CommandText
) jest wysyłane do SQL Server jako odpowiednik przygotowanej instrukcji. Po wykonaniu polecenia parametry i tekst zapytania są traktowane osobno. W żadnym momencie nie jest generowany pełny ciąg SQL.Za pomocą programu SQL Profiler można zajrzeć za kulisy.
źródło
Potrzebowałem polecenia podobnego do transformatora łańcuchowego, aby umożliwić bardziej szczegółowe rejestrowanie, więc napisałem ten. Wygeneruje tekst potrzebny do ponownego wykonania polecenia w nowej sesji, w tym parametry wyjściowe i parametry strukturalne. Jest to lekko przetestowane, ale zastrzeżenie jest puste.
Przykład:
Będzie produkować:
Realizacja:
źródło
N
prefiks.Miałem również ten problem, w którym niektóre sparametryzowane zapytania lub sps dawałyby mi SqlException (głównie łańcuch lub dane binarne zostałyby obcięte), a instrukcje były trudne do debugowania (O ile wiem, obecnie nie ma obsługi SQL-profilera dla SQL Azure)
W reakcjach widzę dużo kodu simularnego. Skończyłem, umieszczając moje rozwiązanie w projekcie Sql-Library do wykorzystania w przyszłości.
Generator jest dostępny tutaj: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Obsługuje zarówno CommandType.Text, jak i CommandType.StoredProcedure
A jeśli zainstalujesz pakiet nuget , możesz go wygenerować za pomocą tego oświadczenia:
źródło
Jeśli używasz programu SQL Server, możesz użyć programu SQL Server Profiler (jeśli go masz), aby wyświetlić faktycznie wykonywany ciąg poleceń. Przydałoby się to do celów testowania kopiowania / wklejania, ale obawiam się, że nie do logowania.
źródło
Późna odpowiedź, wiem, ale ja też tego chciałem, aby móc zalogować SQL. Poniższe informacje są krótkie i spełniają moje potrzeby.
Poniżej przedstawiono kod SQL, który można skopiować / wkleić w SSMS (odpowiednio zastępuje parametry wartościami). Możesz dodać więcej typów, ale spełnia to wszystko, czego używam w tym przypadku.
Teraz mogę zalogować SQL bezpośrednio przed jego wykonaniem:
źródło
Profiler jest najlepszą opcją.
Może być konieczne skopiowanie zestawu instrukcji z profilera ze względu na związane z tym kroki przygotowania + wykonania.
źródło
Miałem to samo dokładne pytanie i po przeczytaniu tych odpowiedzi błędnie zdecydowałem, że nie można uzyskać dokładnego wynikowego zapytania. Myliłem się.
Rozwiązanie: Otwórz
Activity Monitor
wSQL Server Management Studio
, zawęź sekcję procesów do nazwy użytkownika logowania, bazy danych lub nazwy aplikacji używanej przez aplikację w ciągu połączenia. Po nawiązaniu połączenia z odświeżaniem dbActivity Monitor
. Gdy zobaczysz proces, kliknij go prawym przyciskiem myszy iView Details
.Uwaga: może to nie być opłacalną opcją dla zajętej bazy danych. Ale powinieneś być w stanie znacznie zawęzić wynik za pomocą tych kroków.
źródło
Używane części kodu klapa jest dla mojego roztworu, który powraca cały ciąg SQL w tym wartości parametrów, aby uruchomić w MS SQL SMS.
źródło
Moje rozwiązanie:
źródło
Napisałem tę metodę dla siebie. Używam części kodu Bruno Ratnieksa . Może komuś się przyda.
źródło
Jeśli ma to tylko sprawdzić, jak parametr jest sformatowany w zapytaniu wynikowym, większość DBMS pozwoli na zapytanie literałów z niczego. A zatem:
W ten sposób możesz sprawdzić, czy cytaty są podwojone itp.
źródło
Oto, czego używam do wyprowadzania list parametrów procedury składowanej do konsoli debugowania:
Spowoduje to wygenerowanie wyprowadzenia konsoli dla tego:
Umieszczam ten kod bezpośrednio pod każdą procedurą, którą chcę debugować i jest podobny do sesji profilera SQL, ale w języku C #.
źródło
Zmodyfikowana wersja odpowiedzi Kona, ponieważ tylko częściowo działa z podobnymi nazwanymi parametrami. Wadą korzystania z funkcji zamiany ciągu. Poza tym w pełni przypisuję mu rozwiązanie.
źródło
To rozwiązanie działa teraz dla mnie. Może jest to przydatne dla kogoś. Proszę wybaczyć nadmiarowość.
źródło
Jak wspomniano @pkExec i @Alok, funkcja Zastąp nie działa w 100% przypadków. Jest to rozwiązanie, którego użyłem w naszym DAL, który używa RegExp tylko do „dopasowania całego słowa” i prawidłowego formatowania typów danych. W ten sposób wygenerowany SQL można przetestować bezpośrednio w MySQL Workbench (lub SQLSMS itp.) :)
(Zamień funkcję MySQLHelper.EscapeString () zgodnie z zastosowanym DBMS).
Przykład:
Zostanie wygenerowany:
źródło
zapytania komend sql będą wykonywane przy pomocy exec sp_executesql, więc oto inny sposób na uzyskanie instrukcji jako ciągu (metoda rozszerzenia SqlCommand):
źródło
musiałem również obejmować procedury niezapisane, więc rozszerzyłem bibliotekę CommandAsSql (patrz komentarze pod odpowiedzią @ Flapper powyżej) za pomocą tej logiki:
żądanie ściągnięcia znajduje się pod adresem : https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
pomysł Regex opierał się na komentarzach @ stambikk i EvZ powyżej oraz sekcji „Aktualizacja:” https://stackoverflow.com/a/2544661/903783, w której wspomniano o „negatywnym stwierdzeniu wstecznym”. Użycie \ B zamiast \ b do wykrywania granicy słowa na początku wyrażenia regularnego jest spowodowane tym, że p.parameterName zawsze zaczyna się od „@”, który nie jest znakiem słownym.
należy zauważyć, że ParameterValueForSQL () to metoda rozszerzenia zdefiniowana w bibliotece CommandAsSql do obsługi problemów takich jak wartości parametrów ciągu pojedynczego cudzysłowu itp.
źródło
Jeśli przekonwertujesz tekst polecenia:
Teraz możesz uzyskać tekst parametru innego niż parametr w następujący sposób:
a wynikiem jest „UPDATE someTable SET Value = 'myValue' WHERE Id = 1234” bez parametru
źródło
Rozszerzony kod Kon, aby pomóc w debugowaniu procedury składowanej:
W moim pierwszym przypadku testowym wygenerował:
Prawdopodobnie będziesz musiał dodać kilka warunkowych przypisań typu „..jest ...”, np. Dla dat i godzin.
źródło
Jedna wkładka:
źródło
Od polecenia parametru do polecenia innego niż parametr można zmienić to
Do
źródło