Udostępnij za pośrednictwem


sp_describe_undeclared_parameters (Transact-SQL)

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed Instancepunkt końcowy usługi Azure Synapse AnalyticsSQL Analytics w usłudze Microsoft FabricWarehouse w usłudze Microsoft Fabric

Zwraca zestaw wyników zawierający metadane dotyczące niezdecydowanych parametrów w partii Transact-SQL. Uwzględnia każdy parametr używany w partii @tsql, ale nie jest zadeklarowany w @params. Zwracany jest zestaw wyników zawierający jeden wiersz dla każdego takiego parametru z informacjami o typie dla tego parametru. Procedura zwraca pusty zestaw wyników, jeśli partia wejściowa @tsql nie ma parametrów, z wyjątkiem tych zadeklarowanych w @params.

Transact-SQL konwencje składni

Składnia

sp_describe_undeclared_parameters
    [ @tsql = ] 'Transact-SQL_batch'
    [ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]

Nuta

Aby użyć tej procedury składowanej w usłudze Azure Synapse Analytics w dedykowanej puli SQL, ustaw poziom zgodności bazy danych na 20 lub wyższy. Aby zrezygnować, zmień poziom zgodności bazy danych na 10.

Argumenty

Ważny

Argumenty dla rozszerzonych procedur składowanych należy wprowadzić w określonej kolejności zgodnie z opisem w sekcji składni. Jeśli parametry są wprowadzane poza kolejnością, wystąpi komunikat o błędzie.

[ @tsql = ] 'tsql'

Co najmniej jedna instrukcja Transact-SQL. @tsql może być nvarchar(n) lub nvarchar(max).

[ @params = ] N'@parameter_namedata_type [ ,... n ]"

@params zawiera ciąg deklaracji parametrów dla partii Transact-SQL, podobnie jak w przypadku działania sp_executesql. @params może być nvarchar(n) lub nvarchar(max).

Ciąg zawierający definicje wszystkich parametrów osadzonych w @tsql. Ciąg musi być stałą Unicode lub zmienną Unicode. Każda definicja parametru składa się z nazwy parametru i typu danych. n jest symbolem zastępczym wskazującym dodatkowe definicje parametrów. Jeśli instrukcja Transact-SQL lub partia w instrukcji nie zawiera parametrów, @params nie jest wymagana. Wartość domyślna tego parametru to NULL.

Zwracanie wartości kodu

sp_describe_undeclared_parameters zawsze zwraca stan zero w przypadku powodzenia. Jeśli procedura zgłasza błąd i procedura jest wywoływana jako RPC, stan zwracania jest wypełniany przez typ błędu zgodnie z opisem w kolumnie error_typesys.dm_exec_describe_first_result_set. Jeśli procedura jest wywoływana z języka Transact-SQL, zwracana wartość jest zawsze równa zero, nawet w przypadkach błędów.

Zestaw wyników

sp_describe_undeclared_parameters zwraca następujący zestaw wyników.

Nazwa kolumny Typ danych Opis
parameter_ordinal Zawiera położenie porządkowe parametru w zestawie wyników. Pozycja pierwszego parametru jest określona jako 1. Nie można pustą wartość null.
name nazwa systemu Zawiera nazwę parametru. Nie można pustą wartość null.
suggested_system_type_id Zawiera system_type_id typu danych parametru określonego w sys.types.

W przypadku typów CLR, mimo że kolumna system_type_name zwraca wartość NULL, ta kolumna zwraca wartość 240. Nie można pustą wartość null.
suggested_system_type_name nvarchar(256) Zawiera nazwę typu danych. Zawiera argumenty (takie jak długość, precyzja, skala) określone dla typu danych parametru. Jeśli typ danych jest typem aliasu zdefiniowanego przez użytkownika, podstawowy typ systemu jest określony tutaj. Jeśli jest to typ danych zdefiniowany przez użytkownika CLR, NULL zostanie zwrócona w tej kolumnie. Jeśli nie można wywołać typu parametru, zostanie zwrócony NULL. Nullable.
suggested_max_length smallint Zobacz sys.columns. opis kolumny max_length. Nie można pustą wartość null.
suggested_precision tinyint Zobacz sys.columns. opis kolumny precyzji. Nie można pustą wartość null.
suggested_scale tinyint Zobacz sys.columns. opis kolumny skalowania. Nie można pustą wartość null.
suggested_user_type_id W przypadku typów CLR i aliasów zawiera user_type_id typu danych kolumny, jak określono w sys.types. W przeciwnym razie NULL. Nullable.
suggested_user_type_database nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę bazy danych, w której zdefiniowano typ. W przeciwnym razie NULL. Nullable.
suggested_user_type_schema nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę schematu, w którym zdefiniowano typ. W przeciwnym razie NULL. Nullable.
suggested_user_type_name nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę typu. W przeciwnym razie NULL.
suggested_assembly_qualified_type_name nvarchar(4000) W przypadku typów CLR zwraca nazwę zestawu i klasy, która definiuje typ. W przeciwnym razie NULL. Nullable.
suggested_xml_collection_id Zawiera xml_collection_id typu danych parametru określonego w sys.columns. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Nullable.
suggested_xml_collection_database nazwa systemu Zawiera bazę danych, w której zdefiniowano kolekcję schematów XML skojarzona z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Nullable.
suggested_xml_collection_schema nazwa systemu Zawiera schemat, w którym zdefiniowano kolekcję schematów XML skojarzona z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Nullable.
suggested_xml_collection_name nazwa systemu Zawiera nazwę kolekcji schematów XML skojarzonej z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Nullable.
suggested_is_xml_document bitów Zwraca 1, jeśli zwracany typ to XML, a ten typ ma gwarancję, że jest dokumentem XML. W przeciwnym razie zwraca wartość 0. Nie można pustą wartość null.
suggested_is_case_sensitive bitów Zwraca 1, jeśli kolumna ma typ ciągu uwzględniającego wielkość liter i 0, jeśli tak nie jest. Nie można pustą wartość null.
suggested_is_fixed_length_clr_type bitów Zwraca 1, jeśli kolumna ma typ CLR o stałej długości i 0, jeśli tak nie jest. Nie można pustą wartość null.
suggested_is_input bitów Zwraca 1, jeśli parametr jest używany w dowolnym miejscu innym niż lewa strona przypisania. W przeciwnym razie zwraca wartość 0. Nie można pustą wartość null.
suggested_is_output bitów Zwraca 1, jeśli parametr jest używany po lewej stronie przypisania lub jest przekazywany do parametru wyjściowego procedury składowanej. W przeciwnym razie zwraca wartość 0. Nie można pustą wartość null.
formal_parameter_name nazwa systemu Jeśli parametr jest argumentem procedury składowanej lub funkcji zdefiniowanej przez użytkownika, zwraca nazwę odpowiedniego parametru formalnego. W przeciwnym razie zwraca wartość NULL. Nullable.
suggested_tds_type_id Do użytku wewnętrznego. Nie można pustą wartość null.
suggested_tds_length Do użytku wewnętrznego. Nie można pustą wartość null.

Uwagi

sp_describe_undeclared_parameters zawsze zwraca stan zera.

Najczęstszym zastosowaniem jest użycie, gdy aplikacja otrzymuje instrukcję Transact-SQL, która może zawierać parametry i musi przetworzyć je w jakiś sposób. Przykładem jest interfejs użytkownika (taki jak ODBCTest lub RowsetViewer), w którym użytkownik udostępnia zapytanie ze składnią parametrów ODBC. Aplikacja musi dynamicznie odnajdywać liczbę parametrów i monitować użytkownika o każdą z nich.

Innym przykładem jest, gdy bez danych wejściowych użytkownika aplikacja musi przejąć parametry i uzyskać dane z innej lokalizacji (np. tabeli). W takim przypadku aplikacja nie musi jednocześnie przekazywać wszystkich informacji o parametrach. Zamiast tego aplikacja może uzyskać wszystkie informacje o parametrach od dostawcy i uzyskać dane z tabeli. Kod korzystający z sp_describe_undeclared_parameters jest bardziej ogólny i jest mniej prawdopodobne, aby wymagać modyfikacji, jeśli struktura danych zmieni się później.

sp_describe_undeclared_parameters zwraca błąd w każdym z następujących przypadków.

  • @tsql danych wejściowych nie jest prawidłową Transact-SQL wsadową. Ważność jest określana przez analizowanie i analizowanie partii Transact-SQL. Wszelkie błędy spowodowane przez partię podczas optymalizacji zapytań lub podczas wykonywania nie są brane pod uwagę podczas określania, czy Transact-SQL partii jest prawidłowa.

  • @params nie jest NULL i zawiera ciąg, który nie jest składniowo prawidłowym ciągiem deklaracji dla parametrów lub jeśli zawiera ciąg, który deklaruje dowolny parametr więcej niż jeden raz.

  • Partia danych wejściowych Transact-SQL deklaruje zmienną lokalną o tej samej nazwie co parametr zadeklarowany w @params.

  • Instrukcja odwołuje się do tabel tymczasowych.

  • Zapytanie zawiera tworzenie stałej tabeli, która jest następnie odpytywane.

Jeśli @tsql nie ma parametrów innych niż parametry zadeklarowane w @params, procedura zwraca pusty zestaw wyników.

Nuta

Musisz zadeklarować zmienną jako zmienną skalarną Transact-SQL lub pojawi się błąd.

Algorytm wyboru parametrów

W przypadku zapytania z nierejestrowanym parametrami odliczenie typu danych dla niezdecydowanych parametrów jest kontynuowane w trzech krokach.

Krok 1. Znajdowanie typów danych w wyrażeniach podrzędnych

Pierwszym krokiem w odliczeniu typu danych dla zapytania z nierejestrowanym parametrami jest znalezienie typów danych wszystkich wyrażeń podrzędnych, których typy danych nie zależą od niezdecydowanych parametrów. Typ można określić dla następujących wyrażeń:

  • Kolumny, stałe, zmienne i zadeklarowane parametry.
  • Wyniki wywołania funkcji zdefiniowanej przez użytkownika (UDF).
  • Wyrażenie z typami danych, które nie zależą od niezdecydowanych parametrów dla wszystkich danych wejściowych.

Rozważmy na przykład zapytanie SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2. Wyrażenia dbo.tbl(@p1) + c1 i c2 mają typy danych, a @p1 wyrażenia i @p2 + 2 nie.

Jeśli po tym kroku dowolne wyrażenie (inne niż wywołanie funkcji zdefiniowanej przez użytkownika) ma dwa argumenty bez typów danych, potrącenie typu kończy się niepowodzeniem z powodu błędu. Na przykład następujące wszystkie błędy:

SELECT * FROM t1 WHERE @p1 = @p2;
SELECT * FROM t1 WHERE c1 = @p1 + @p2;
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3);

Poniższy przykład nie generuje błędu:

SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3);

Krok 2. Znajdowanie wyrażeń wewnętrznych

Dla danego niezdecydowanego parametru @palgorytm odliczenia typu znajduje najbardziej wewnętrzne wyrażenie E(@p), które zawiera @p i jest jednym z następujących argumentów:

  • Argument operatora porównania lub przypisania.
  • Argument funkcji zdefiniowanej przez użytkownika (w tym funkcji zdefiniowanej przez użytkownika), procedury lub metody.
  • Argument klauzuli VALUES instrukcji INSERT.
  • Argument CAST lub CONVERT.

Algorytm potrącenia typu znajduje docelowy typ danych TT(@p) dla E(@p). Docelowe typy danych dla poprzednich przykładów są następujące:

  • Typ danych po drugiej stronie porównania lub przypisania.
  • Zadeklarowany typ danych parametru, do którego jest przekazywany ten argument.
  • Typ danych kolumny, do której jest wstawiona ta wartość.
  • Typ danych, do którego instrukcja jest rzutowania lub konwertowania.

Rozważmy na przykład zapytanie SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1). Następnie E(@p1) = @p1, E(@p2) = @p2 + c1, TT(@p1) jest zadeklarowany zwracany typ danych dbo.tbl, a TT(@p2) to zadeklarowany typ danych parametru dla dbo.tbl.

Jeśli @p nie znajduje się w żadnym wyrażeniu wymienionym na początku kroku 2, algorytm odliczenia typu określa, że E(@p) jest największym wyrażeniem skalarnym zawierającym @p, a algorytm odliczenia typu nie oblicza docelowego typu danych TT(@p) dla E(@p). Jeśli na przykład zapytanie jest SELECT @p + 2, E(@p) = @p + 2i nie ma TT(@p).

Krok 3. Deduj typy danych

Teraz, gdy zidentyfikowano E(@p) i TT(@p), algorytm odliczania typów deduuje typ danych dla @p na jeden z następujących dwóch sposobów:

  • Proste potrącenie

    Jeśli E(@p) = @p i TT(@p) istnieje, oznacza to, że jeśli @p jest bezpośrednio argumentem do jednego z wyrażeń wymienionych na początku kroku 2, algorytm odliczenia typu deduuje typ danych @p być TT(@p). Na przykład:

    SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);
    

    Typ danych @p1, @p2i @p3 to typ danych c1, zwracany typ danych dbo.tbli typ danych parametru odpowiednio dla dbo.tbl.

    W specjalnym przypadku, jeśli @p jest argumentem <, >, <=lub operatorem >=, proste reguły odliczenia nie mają zastosowania. Algorytm odliczenia typu będzie używać ogólnych reguł odliczenia wyjaśnień w następnej sekcji. Jeśli na przykład c1 jest kolumną typu danych char(30), rozważ następujące dwa zapytania:

    SELECT * FROM t WHERE c1 = @p;
    SELECT * FROM t WHERE c1 > @p;
    

    W pierwszym przypadku algorytm odliczeń typów char(30) jako typ danych dla @p zgodnie z regułami wcześniej w tym artykule. W drugim przypadku algorytm odliczenia typu deducesji varchar(8000) zgodnie z ogólnymi regułami odliczenia w następnej sekcji.

  • Ogólne odliczenie

    Jeśli proste odliczenie nie ma zastosowania, następujące typy danych są brane pod uwagę w przypadku nierejestrowanych parametrów:

    • Typy danych całkowitych (bitowe, tinyint, smallint, int, bigint)

    • Typy danych pieniężnych (małe, pieniądze)

    • Typy danych zmiennoprzecinkowych (zmiennoprzecinkowe, rzeczywiste)

    • liczbowe (38, 19) — nie są brane pod uwagę inne typy danych liczbowych lub dziesiętnych.

    • varchar(8000), varchar(max), nvarchar(4000)i nvarchar() max) — inne typy danych ciągów (takie jak tekst, char(8000), nvarchar(30)itp.) nie są brane pod uwagę.

    • varbinary(8000) i varbinary(max) — inne typy danych binarnych nie są brane pod uwagę (takie jak obraz, binary(8000), varbinary(30)itp.).

    • data, godzina (7), smalldatetime , data/godzina, data/godzina2(7), datetimeoffset(7) — inne typy dat i godzin, takie jak time(4), nie są brane pod uwagę.

    • sql_variant

    • xml

    • Typy zdefiniowane przez system CLR (hierarchyid, geometria, geografii)

    • Typy zdefiniowane przez użytkownika środowiska CLR

Kryteria wyboru

Spośród typów danych kandydatów wszelkie typy danych, które unieważniłyby zapytanie, zostanie odrzucone. Spośród pozostałych typów danych kandydatów algorytm odliczenia typu wybiera jeden zgodnie z następującymi regułami.

  1. Wybrano typ danych, który generuje najmniejszą liczbę niejawnych konwersji w E(@p). Jeśli określony typ danych generuje typ danych dla E(@p), który różni się od TT(@p), algorytm odliczenia typu uważa, że jest to dodatkowa niejawna konwersja z typu danych E(@p) do TT(@p).

    Na przykład:

    SELECT * FROM t WHERE Col_Int = Col_Int + @p;
    

    W tym przypadku E(@p) jest Col_Int + @p, a TT(@p). jest wybierana dla @p, ponieważ nie generuje niejawnych konwersji. Każdy inny wybór typu danych powoduje co najmniej jedną niejawną konwersję.

  2. Jeśli wiele typów danych wiąże się z najmniejszą liczbą konwersji, używany jest typ danych o większym pierwszeństwie. Na przykład:

    SELECT * FROM t WHERE Col_Int = Col_smallint + @p;
    

    W tym przypadku i smallint generują jedną konwersję. Każdy inny typ danych generuje więcej niż jedną konwersję. Ponieważ int ma pierwszeństwo przed smallint, jest używany do @p. Aby uzyskać więcej informacji na temat pierwszeństwa typu danych, zobacz Pierwszeństwo typu danych.

    Ta reguła ma zastosowanie tylko wtedy, gdy istnieje niejawna konwersja między każdym typem danych, który łączy się zgodnie z regułą 1 i typem danych o największym pierwszeństwie. Jeśli nie ma niejawnej konwersji, potrącenie typu danych kończy się niepowodzeniem z powodu błędu. Na przykład w zapytaniu SELECT @p FROM twnioskowanie typu danych kończy się niepowodzeniem, ponieważ dowolny typ danych dla @p byłby równie dobry. Na przykład nie istnieje niejawna konwersja z int na xml .

  3. Jeśli w regule 1 istnieją dwa podobne typy danych, na przykład varchar(8000) i varchar(max), wybierany jest mniejszy typ danych (varchar(8000)). Ta sama zasada ma zastosowanie do nvarchar i typów danych varbinary.

  4. Dla celów reguły 1 algorytm odliczenia typu preferuje pewne konwersje jako lepsze niż inne. Konwersje w kolejności od najlepszych do najgorszych to:

    1. Konwersja między tym samym podstawowym typem danych o różnej długości.
    2. Konwersja między wersją danych o stałej długości a zmienną długością tych samych typów danych (na przykład char do varchar).
    3. Konwersja między NULL a int.
    4. Każda inna konwersja.

Na przykład dla SELECT * FROM t WHERE [Col_varchar(30)] > @pzapytania wybrano varchar(8000), ponieważ konwersja (a) jest najlepsza. W przypadku SELECT * FROM t WHERE [Col_char(30)] > @pzapytania varchar(8000) jest nadal wybierana, ponieważ powoduje konwersję typu (b) i dlatego, że inny wybór (taki jak varchar(4000)) spowoduje konwersję typu (d).

W ostatnim przykładzie, biorąc pod uwagę zapytanie SELECT NULL + @p, int jest wybierana dla @p, ponieważ powoduje konwersję typu (c).

Uprawnienia

Wymaga uprawnień do wykonania argumentu @tsql.

Przykłady

Poniższy przykład zwraca informacje, takie jak oczekiwany typ danych dla niezadeklarowanych parametrów @id i @name.

EXEC sp_describe_undeclared_parameters @tsql =
N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR name = @name';

Po podaniu parametru @id jako odwołania @params parametr @id zostanie pominięty z zestawu wyników i opisano tylko parametr @name.

EXEC sp_describe_undeclared_parameters @tsql =
N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR NAME = @name',
@params = N'@id int';