sp_describe_undeclared_parameters (Transact-SQL)sp_describe_undeclared_parameters (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Retorna um conjunto de resultados que contém metadados sobre parâmetros não declarados em um Transact-SQLTransact-SQL lote.Returns a result set that contains metadata about undeclared parameters in a Transact-SQLTransact-SQL batch. Considera cada parâmetro usado no lote @TSQL , mas não declarado em parâmetros@ .Considers each parameter that is used in the @tsql batch, but not declared in @params. Um conjunto de resultados que contém uma linha para cada um desses parâmetros é retornado com as informações de tipo deduzidas para esse parâmetro.A result set is returned that contains one row for each such parameter, with the deduced type information for that parameter. O procedimento retornará um conjunto de resultados vazio se o lote de entrada de @TSQL não tiver parâmetros, exceto aqueles declarados em @params.The procedure returns an empty result set if the @tsql input batch has no parameters except those declared in @params.

Ícone de link do tópico Convenções de sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

  
sp_describe_undeclared_parameters   
    [ @tsql = ] 'Transact-SQL_batch'   
    [ , [ @params = ] N'parameters' data type ] [, ...n]  

ArgumentosArguments

[ \@tsql = ] 'Transact-SQL\_batch' uma ou mais instruções Transact-SQLTransact-SQL.[ \@tsql = ] 'Transact-SQL\_batch' One or more Transact-SQLTransact-SQL statements. O Transact-SQL_batch pode ser nvarchar ( n ) ou nvarchar (max) .Transact-SQL_batch may be nvarchar(n) or nvarchar(max).

[ \@params = ] N'parameters' @params fornece uma cadeia de caracteres de declaração para parâmetros para o lote de Transact-SQLTransact-SQL, da mesma forma que o sp_executesql funciona.[ \@params = ] N'parameters' @params provides a declaration string for parameters for the Transact-SQLTransact-SQL batch, similarly to the way sp_executesql works. Os parâmetros podem ser nvarchar ( n ) ou nvarchar (max) .Parameters may be nvarchar(n) or nvarchar(max).

É uma cadeia de caracteres que contém as definições de todos os parâmetros que foram inseridos em Transact-SQL_batch.Is one string that contains the definitions of all parameters that have been embedded in Transact-SQL_batch. A cadeia de caracteres deve ser uma constante Unicode ou uma variável Unicode.The string must be either a Unicode constant or a Unicode variable. Cada definição de parâmetro consiste em um nome de parâmetro e um tipo de dados.Each parameter definition consists of a parameter name and a data type. n é um espaço reservado que indica definições de parâmetro adicionais.n is a placeholder that indicates additional parameter definitions. Se a instrução Transact-SQL ou o lote na instrução não contiver parâmetros, @params não será necessário.If the Transact-SQL statement or batch in the statement does not contain parameters, @params is not required. O valor padrão para este parâmetro é NULL.The default value for this parameter is NULL.

DatatypeDatatype
O tipo de dados do parâmetro.The data type of the parameter.

Valores do código de retornoReturn Code Values

sp_describe_undeclared_parameters sempre retorna o status de retorno de zero em caso de êxito.sp_describe_undeclared_parameters always returns return status of zero on success. Se o procedimento lançar um erro e o procedimento for chamado como um RPC, o status de retorno será preenchido pelo tipo de erro, conforme descrito na coluna error_type de sys. dm_exec_describe_first_result_set.If the procedure throws an error and the procedure is called as an RPC, the return status is populated by the type of error as described in the error_type column of sys.dm_exec_describe_first_result_set. Se o procedimento for chamado de Transact-SQLTransact-SQL, o valor de retorno sempre será zero, até mesmo em casos de erro.If the procedure is called from Transact-SQLTransact-SQL, the return value is always zero, even in error cases.

Conjuntos de resultadosResult Sets

sp_describe_undeclared_parameters retorna o seguinte conjunto de resultados.sp_describe_undeclared_parameters returns the following result set.

Nome da colunaColumn name Tipo de dadosData type DescriçãoDescription
parameter_ordinalparameter_ordinal int não nuloint NOT NULL Contém a posição ordinal do parâmetro no conjunto de resultados.Contains the ordinal position of the parameter in the result set. A posição do primeiro parâmetro será especificada como 1.Position of the first parameter will be specified as 1.
namename sysname não nulosysname NOT NULL Contém o nome do parâmetro.Contains the name of the parameter.
suggested_system_type_idsuggested_system_type_id int não nuloint NOT NULL Contém a system_type_id do tipo de dados do parâmetro, conforme especificado em sys. Types.Contains the system_type_id of the data type of the parameter as specified in sys.types.

Para tipos CLR, embora a coluna system_type_name retornará NULL, essa coluna retornará o valor 240.For CLR types, even though the system_type_name column will return NULL, this column will return the value 240.
suggested_system_type_namesuggested_system_type_name nvarchar (256) NULLnvarchar (256) NULL Contém o nome do tipo de dados.Contains the data type name. Inclui argumentos (como comprimento, precisão, escala) especificados para o tipo de dados do parâmetro.Includes arguments (such as length, precision, scale) specified for the data type of the parameter. Se o tipo de dados for um tipo de alias definido pelo usuário, o tipo de sistema subjacente será especificado aqui.If the data type is a user-defined alias type, the underlying system type is specified here. Se for um tipo de dados CLR definido pelo usuário, NULL será retornado nessa coluna.If it is a CLR user-defined data type, NULL is returned in this column. Se não for possível deduzir o tipo de parâmetro, NULL será retornado.If the type of the parameter cannot be deduced, NULL is returned.
suggested_max_lengthsuggested_max_length smallint não nulosmallint NOT NULL Consulte sys. Columns.See sys.columns. para max_length descrição da coluna.for max_length column description.
suggested_precisionsuggested_precision tinyint não nulotinyint NOT NULL Consulte sys. Columns.See sys.columns. para obter a descrição da coluna de precisão.for precision column description.
suggested_scalesuggested_scale tinyint não nulotinyint NOT NULL Consulte sys. Columns.See sys.columns. para obter a descrição da coluna de escala.for scale column description.
suggested_user_type_idsuggested_user_type_id int NULLint NULL Para tipos de CLR e alias, contém o user_type_id do tipo de dados da coluna como especificado em sys.types.For CLR and alias types, contains the user_type_id of the data type of the column as specified in sys.types. Caso contrário, é NULL.Otherwise is NULL.
suggested_user_type_databasesuggested_user_type_database sysname nulosysname NULL Para tipos de CLR e de alias, contém o nome do banco de dados no qual o tipo é definido.For CLR and alias types, contains the name of the database in which the type is defined. Caso contrário, é NULL.Otherwise is NULL.
suggested_user_type_schemasuggested_user_type_schema sysname nulosysname NULL Para tipos de CLR e de alias, contém o nome do esquema no qual o tipo é definido.For CLR and alias types, contains the name of the schema in which the type is defined. Caso contrário, é NULL.Otherwise is NULL.
suggested_user_type_namesuggested_user_type_name sysname nulosysname NULL Para tipos de CLR e de alias, contém o nome do tipo.For CLR and alias types, contains the name of the type. Caso contrário, é NULL.Otherwise is NULL.
suggested_assembly_qualified_type_namesuggested_assembly_qualified_type_name nvarchar (4000) NULLnvarchar (4000) NULL Para tipos CLR, retorna o nome do assembly e a classe que define o tipo.For CLR types, returns the name of the assembly and class that defines the type. Caso contrário, é NULL.Otherwise is NULL.
suggested_xml_collection_idsuggested_xml_collection_id int NULLint NULL Contém a xml_collection_id do tipo de dados do parâmetro, conforme especificado em sys. Columns.Contains the xml_collection_id of the data type of the parameter as specified in sys.columns. Esta coluna retornará NULL se o tipo retornado não estiver associado a uma coleção de esquema XML.This column will return NULL if the type returned is not associated with an XML schema collection.
suggested_xml_collection_databasesuggested_xml_collection_database sysname nulosysname NULL Contém o banco de dados no qual a coleção de esquemas XML associada a esse tipo está definida.Contains the database in which the XML schema collection associated with this type is defined. Esta coluna retornará NULL se o tipo retornado não estiver associado a uma coleção de esquema XML.This column will return NULL if the type returned is not associated with an XML schema collection.
suggested_xml_collection_schemasuggested_xml_collection_schema sysname nulosysname NULL Contém o esquema no qual a coleção de esquemas XML associada a esse tipo está definida.Contains the schema in which the XML schema collection associated with this type is defined. Esta coluna retornará NULL se o tipo retornado não estiver associado a uma coleção de esquema XML.This column will return NULL if the type returned is not associated with an XML schema collection.
suggested_xml_collection_namesuggested_xml_collection_name sysname nulosysname NULL Contém o nome da coleção de esquemas XML associada a esse tipo.Contains the name of the XML schema collection associated with this type. Esta coluna retornará NULL se o tipo retornado não estiver associado a uma coleção de esquema XML.This column will return NULL if the type returned is not associated with an XML schema collection.
suggested_is_xml_documentsuggested_is_xml_document bit não nulobit NOT NULL Retornará 1 se o tipo retornado for o XML e esse tipo for, com certeza, um documento XML.Returns 1 if the type being returned is XML and that type is guaranteed to be an XML document. Caso contrário, retorna 0.Otherwise returns 0.
suggested_is_case_sensitivesuggested_is_case_sensitive bit não nulobit NOT NULL Retornará 1 se a coluna for de um tipo de cadeia de caracteres com diferenciação de maiúsculas e minúsculas e 0 se não for.Returns 1 if the column is of a case-sensitive string type and 0 if it is not.
suggested_is_fixed_length_clr_typesuggested_is_fixed_length_clr_type bit não nulobit NOT NULL Retornará 1 se a coluna for de um tipo de CLR de comprimento fixo e 0 se não for.Returns 1 if the column is of a fixed-length CLR type and 0 if it is not.
suggested_is_inputsuggested_is_input bit não nulobit NOT NULL Retornará 1 se o parâmetro for usado em qualquer lugar, sem ser o lado esquerdo de uma atribuição.Returns 1 if the parameter is used anywhere other than left side of an assignment. Caso contrário, retorna 0.Otherwise returns 0.
suggested_is_outputsuggested_is_output bit não nulobit NOT NULL Retornará 1 se o parâmetro for usado no lado esquerdo de uma atribuição ou se for transmitido a um parâmetro de saída de um procedimento armazenado.Returns 1 if the parameter is used on the left side of an assignment or is passed to an output parameter of a stored procedure. Caso contrário, retorna 0.Otherwise returns 0.
formal_parameter_nameformal_parameter_name sysname nulosysname NULL Se o parâmetro for um argumento para um procedimento armazenado ou uma função definida pelo usuário, retornará o nome do parâmetro formal correspondente.If the parameter is an argument to a stored procedure or a user-defined function, returns the name of the corresponding formal parameter. Caso contrário, retorna NULL.Otherwise returns NULL.
suggested_tds_type_idsuggested_tds_type_id int não nuloint NOT NULL Para uso interno.For internal use.
suggested_tds_lengthsuggested_tds_length int não nuloint NOT NULL Para uso interno.For internal use.

RemarksRemarks

sp_describe_undeclared_parameters sempre retorna o status de retorno zero.sp_describe_undeclared_parameters always returns return status of zero.

O uso mais comum é quando um aplicativo recebe uma instrução Transact-SQLTransact-SQL que pode conter parâmetros e precisa processá-los de algum modo.The most common use is when an application is given a Transact-SQLTransact-SQL statement that might contain parameters and must process them in some way. Um exemplo é uma interface do usuário (como ODBCTest ou RowsetViewer) em que o usuário fornece uma consulta com a sintaxe de parâmetro ODBC.An example is a user interface (such as ODBCTest or RowsetViewer) where the user provides a query with ODBC parameter syntax. O aplicativo deve descobrir o número de parâmetros dinamicamente e deve solicitar cada parâmetro ao usuário.The application must dynamically discover the number of parameters and prompt the user for each one.

Outro exemplo ocorre quando, sem entrada do usuário, um aplicativo precisa executar um loop dos parâmetros e obter os dados para eles de algum outro local (como uma tabela).Another example is when without user input, an application must loop over the parameters and obtain the data for them from some other location (such as a table). Nesse caso, o aplicativo não tem que transmitir todas as informações de parâmetro de uma vez.In this case, the application does not have to pass all the parameter information at once. Em vez disso, o aplicativo pode obter todas as informações de parâmetros do provedor e pode obter os próprios dados na tabela.Instead, the application can get all the parameters information from the provider and obtain the data itself from the table. O código usando sp_describe_undeclared_parameters é mais genérico e é menos provável que exija modificação se a estrutura de dados for alterada posteriormente.Code using sp_describe_undeclared_parameters is more generic and is less likely to require modification if the data structure changes later.

sp_describe_undeclared_parameters retorna um erro em qualquer um dos casos a seguir.sp_describe_undeclared_parameters returns an error in any of the following cases.

  • Se a entrada @TSQL não for um lote de Transact-SQLTransact-SQL válido.If the input @tsql is not a valid Transact-SQLTransact-SQL batch. A validade é determinada pela análise e análise do lote de Transact-SQLTransact-SQL.Validity is determined by parsing and analyzing the Transact-SQLTransact-SQL batch. Todos os erros causados pelo lote durante a otimização da consulta ou durante a execução não são considerados ao determinar se o lote de Transact-SQLTransact-SQL é válido.Any errors caused by the batch during query optimization or during execution are not considered when determining whether the Transact-SQLTransact-SQL batch is valid.

  • Se @params não for nulo e contiver uma cadeia de caracteres que não seja uma cadeia de caracteres de declaração sintaticamente válida para parâmetros, ou se ele contiver uma cadeia de caracteres que declare qualquer parâmetro mais de uma vez.If @params is not NULL and contains a string that is not a syntactically valid declaration string for parameters, or if it contains a string that declares any parameter more than one time.

  • Se a entrada Transact-SQLTransact-SQL lote declarar uma variável local do mesmo nome que um parâmetro declarado em @params.If the input Transact-SQLTransact-SQL batch declares a local variable of the same name as a parameter declared in @params.

  • Se a instrução fizer referência a tabelas temporárias.If the statement references temporary tables.

  • A consulta inclui a criação de uma tabela permanente que é então consultada.The query includes the creation of a permanent table that is then queried.

Se @TSQL não tiver parâmetros, além daqueles declarados em @params, o procedimento retornará um conjunto de resultados vazio.If @tsql has no parameters, other than those declared in @params, the procedure returns an empty result set.

Algoritmo de seleção de parâmetroParameter Selection Algorithm

Para uma consulta com parâmetros não declarados, a dedução de tipo de dados para parâmetros não declarados é realizada em três etapas.For a query with undeclared parameters, data type deduction for undeclared parameters proceeds in three steps.

Etapa 1Step 1

A primeira etapa na dedução do tipo de dados para uma consulta com parâmetros não declarados é localizar os tipos de dados de todas as subexpressões cujos tipos de dados não dependem de parâmetros não declarados.The first step in data type deduction for a query with undeclared parameters is to find the data types of all the sub-expressions whose data types do not depend on the undeclared parameters. É possível determinar o tipo para as seguintes expressões:The type can be determined for the following expressions:

  • Colunas, constantes, variáveis e parâmetros declarados.Columns, constants, variables, and declared parameters.

  • Os resultados de uma chamada para uma UDF (função definida pelo usuário).Results of a call to a user-defined function (UDF).

  • Uma expressão com tipos de dados que não dependem de parâmetros não declarados para todas as entradas.An expression with data types that do not depend on the undeclared parameters for all inputs.

Por exemplo, considere a consulta SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2.For example, consider the query SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2. As expressões dbo. tbl (@P1) + C1 e C2 têm tipos de dados, e Expression @P1 e @P2 + 2 não.The expressions dbo.tbl(@p1) + c1 and c2 have data types, and expression @p1 and @p2 + 2 do not.

Depois dessa etapa, se qualquer expressão (sem ser uma chamada para uma UDF) tiver dois argumentos sem tipos de dados, a dedução de tipo falhará com um erro.After this step, if any expression (other than a call to a UDF) has two arguments without data types, type deduction fails with an error. Por exemplo, os seguintes itens geram erros:For example, the following all produce errors:

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

O seguinte exemplo não gera um erro:The following example does not produce an error:

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

Etapa 2Step 2

Para um determinado parâmetro não declarado @p, o algoritmo de dedução de tipo encontra a expressão mais interna E (@p) que contém @p e é um dos seguintes:For a given undeclared parameter @p, the type deduction algorithm finds the innermost expression E(@p) that contains @p and is one of the following:

  • Um argumento para um operador comparação ou atribuição.An argument to a comparison or assignment operator.

  • Um argumento para uma função definida pelo usuário (incluindo a UDF com valor de tabela), procedimento ou método.An argument to a user-defined function (including table-valued UDF), procedure, or method.

  • Um argumento para uma cláusula Values de uma instrução Insert .An argument to a VALUES clause of an INSERT statement.

  • Um argumento para uma conversão ou conversão.An argument to a CAST or CONVERT.

O algoritmo de dedução de tipo encontra um tipo de dados de destino TT (@p) para E (@p).The type deduction algorithm finds a target data type TT(@p) for E(@p). A seguir são apresentados tipos de dados de destino dos exemplos anteriores:Target data types for the previous examples are as follows:

  • O tipo de dados do outro lado da comparação ou atribuição.The data type of the other side of the comparison or assignment.

  • O tipo de dados declarado do parâmetro ao qual esse argumento foi passado.The declared data type of the parameter to which this argument is passed.

  • O tipo de dados da coluna na qual esse valor é inserido.The data type of the column into which this value is inserted.

  • O tipo de dados no qual a instrução está convertendo.The data type to which the statement is casting or converting.

Por exemplo, considere a consulta SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1).For example, consider the query SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1). Em seguida, E (@P1) = @P1, E (@P2) = @P2 + C1, TT (@P1) é o tipo de dados de retorno declarado de dbo. tbl e TT (@P2) é o tipo de dados de parâmetro declarado para dbo. tbl.Then E(@p1) = @p1, E(@p2) = @p2 + c1, TT(@p1) is the declared return data type of dbo.tbl, and TT(@p2) is the declared parameter data type for dbo.tbl.

Se @p não estiver contido em nenhuma expressão listada no início da etapa 2, o algoritmo de dedução de tipo determinará que E (@p) é a maior expressão escalar que contém @p e o algoritmo de dedução de tipo não computa um tipo de dados de destino TT (@p) para E (@p).If @p is not contained in any expression listed at the beginning of step 2, the type deduction algorithm determines that E(@p) is the largest scalar expression that contains @p, and the type deduction algorithm does not compute a target data type TT(@p) for E(@p). Por exemplo, se a consulta for selecionada @p + 2 E (@p) = @p + 2 e não houver TT (@p).For example, if the query is SELECT @p + 2 then E(@p) = @p + 2, and there is no TT(@p).

Etapa 3Step 3

Agora que E (@p) e TT (@p) são identificados, o algoritmo de dedução de tipo deduz um tipo de dados para @p de uma das duas maneiras a seguir:Now that E(@p) and TT(@p) are identified, the type deduction algorithm deduces a data type for @p in one of the following two ways:

  • Dedução simplesSimple deduction

    Se E (@p) = @p e TT (@p) existir, ou seja, se @p for diretamente um argumento para uma das expressões listadas no início da etapa 2, o algoritmo de dedução de tipo deduzirá o tipo de dados de @p para ser TT (@p).If E(@p) = @p and TT(@p) exists, i.e., if @p is directly an argument to one of the expressions listed at the beginning of step 2, the type deduction algorithm deduces the data type of @p to be TT(@p). Por exemplo:For example:

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

    O tipo de dados para @P1, @P2 e @P3 será o tipo de dados de C1, o tipo de dados de retorno de dbo. tbl e o tipo de dados de parâmetro para dbo. tbl, respectivamente.The data type for @p1, @p2, and @p3 will be the data type of c1, the return data type of dbo.tbl, and the parameter data type for dbo.tbl respectively.

    Como um caso especial, se @p é um argumento para um operador <, >, <= ou > =, as regras de dedução simples não se aplicam.As a special case, if @p is an argument to a <, >, <=, or >= operator, simple deduction rules do not apply. O algoritmo de dedução de tipo usará as regras de dedução gerais explicadas na próxima seção.The type deduction algorithm will use the general deduction rules explained in the next section. Por exemplo, se c1 for uma coluna do tipo de dados char(30), considere as duas consultas a seguir:For example, if c1 is a column of data type char(30), consider the following two queries:

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

    No primeiro caso, o algoritmo de dedução de tipo deduz Char (30) como o tipo de dados para @p de acordo com as regras anteriores neste tópico.In the first case, the type deduction algorithm deduces char(30) as the data type for @p as per rules earlier in this topic. No segundo caso, o algoritmo de dedução de tipo deduz varchar (8000) de acordo com as regras de dedução gerais na próxima seção.In the second case, the type deduction algorithm deduces varchar(8000) according to the general deduction rules in the next section.

  • Dedução geralGeneral deduction

    Se a dedução simples não for aplicável, os seguintes tipos de dados serão considerados para parâmetros não declarados:If simple deduction does not apply, the following data types are considered for undeclared parameters:

    • Tipos de dados Integer (bit, tinyint, smallint, int, bigint)Integer data types (bit, tinyint, smallint, int, bigint)

    • Tipos de dados Money (smallmoney, Money)Money data types (smallmoney, money)

    • Tipos de dados de ponto flutuante (float, real)Floating-point data types (float, real)

    • numeric (38, 19) -outros tipos de dados numéricos ou decimais não são considerados.numeric(38, 19) - Other numeric or decimal data types are not considered.

    • varchar (8000) , varchar (max) , nvarchar (4000) e nvarchar (max) -outros tipos de dados de cadeia de caracteres (como Text, Char (8000) , nvarchar (30) , etc.) não são considerados.varchar(8000), varchar(max), nvarchar(4000), and nvarchar(max) - Other string data types (such as text, char(8000), nvarchar(30), etc.) are not considered.

    • varbinary (8000) e varbinary (max) -outros tipos de dados binários não são considerados (como Image, binary (8000) , varbinary (30) , etc.).varbinary(8000) and varbinary(max) - Other binary data types are not considered (such as image, binary(8000), varbinary(30), etc.).

    • Date, time (7) , smalldatetime, DateTime, datetime2 (7) , DateTimeOffset (7) -outros tipos de data e hora, como time (4) , não são considerados.date, time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7) - Other date and time types, such as time(4), are not considered.

    • sql_variantsql_variant

    • xmlxml

    • Tipos CLR definidos pelo sistema (hierarchyid, Geometry, geography)CLR system-defined types (hierarchyid, geometry, geography)

    • Tipos definidos pelo usuário de CLRCLR user-defined types

Critérios de seleçãoSelection Criteria

Dos tipos de dados candidatos, qualquer tipo de dados que invalide a consulta será rejeitado.Of the candidate data types, any data type that would invalidate the query is rejected. Dos tipos de dados candidatos restantes, o algoritmo de dedução de tipo seleciona um item de acordo com as regras a seguir.Of the remaining candidate data types, the type deduction algorithm selects one according to the following rules.

  1. O tipo de dados que produz o menor número de conversões implícitas em E (@p) é selecionado.The data type that produces the smallest number of implicit conversions in E(@p) is selected. Se um tipo de dados específico produzir um tipo de dados para E (@p) diferente de TT (@p), o algoritmo de dedução de tipo considerará que isso é uma conversão implícita extra do tipo de dados de E (@p) para TT (@p).If a particular data type produces a data type for E(@p) that is different from TT(@p), the type deduction algorithm considers this to be an extra implicit conversion from the data type of E(@p) to TT(@p).

    Por exemplo:For example:

    SELECT * FROM t WHERE Col_Int = Col_Int + @p  
    

    Nesse caso, E (@p) é Col_Int + @p e TT (@p) é int. int é escolhido para @p porque ele não produz conversões implícitas.In this case, E(@p) is Col_Int + @p and TT(@p) is int. int is chosen for @p because it produces no implicit conversions. Qualquer outra escolha de tipo de dados gera uma conversão implícita pelo menos.Any other choice of data type produces at least one implicit conversion.

  2. Se houver vários tipos de dados ligados ao menor número de conversões, o tipo de dados com a precedência mais alta será usada.If multiple data types tie for the smallest number of conversions, the data type with greater precedence is used. Por exemploFor example

    SELECT * FROM t WHERE Col_Int = Col_smallint + @p  
    

    Nesse caso, int e smallint produzem uma conversão.In this case, int and smallint produce one conversion. Todos os outros tipos de dados geram mais de uma conversão.Every other data type produces more than one conversion. Como int tem precedência sobre smallint, int é usado para @p.Because int takes precedence over smallint, int is used for @p. Para obter mais informações sobre a precedência de tipo de dados, consulte (precedência de tipo de dados Transact-SQL).For more information about data type precedence, see Data Type Precedence (Transact-SQL).

    Essa regra somente se aplicará se houver uma conversão implícita entre cada tipo de dados ligado de acordo com regra 1 e o tipo de dados com a precedência mais alta.This rule only applies if there is an implicit conversion between every data type that ties according to rule 1 and the data type with the greatest precedence. Se não houver nenhuma conversão implícita, a dedução de tipo de dados falhará com um erro.If there is no implicit conversion, then data type deduction fails with an error. Por exemplo, no SELECT @p FROM tde consulta, a dedução de tipo de dados falha porque qualquer tipo de dados para @p seria igualmente bom.For example in the query SELECT @p FROM t, data type deduction fails because any data type for @p would be equally good. Por exemplo, não há conversão implícita de int para XML.For example, there is no implicit conversion from int to xml.

  3. Se dois tipos de dados semelhantes se vincularem sob a regra 1, por exemplo, varchar (8000) e varchar (max) , o tipo de dados menor (varchar (8000) ) será escolhido.If two similar data types tie under rule 1, for example varchar(8000) and varchar(max), the smaller data type (varchar(8000)) is chosen. O mesmo princípio se aplica aos tipos de dados nvarchar e varbinary .The same principle applies to nvarchar and varbinary data types.

  4. Para os propósitos da regra 1, o algoritmo de dedução de tipo considera certas conversões melhores que outras.For purposes of rule 1, the type deduction algorithm prefers certain conversions as better than others. As conversões, na ordem da melhor para a pior são:Conversions in order from best to worst are:

    1. Conversão entre o mesmo tipo de dados básico de comprimento diferente.Conversion between same basic data type of different length.

    2. Conversão entre a versão de tamanho fixo e de comprimento variável dos mesmos tipos de dados (por exemplo, Char para varchar).Conversion between fixed-length and variable-length version of same data types (e.g., char to varchar).

    3. Conversão entre NULL e int.Conversion between NULL and int.

    4. Qualquer outra conversão.Any other conversion.

Por exemplo, para a consulta SELECT * FROM t WHERE [Col_varchar(30)] > @p, varchar (8000) é escolhido porque a conversão (a) é a melhor.For example, for the query SELECT * FROM t WHERE [Col_varchar(30)] > @p, varchar(8000) is chosen because conversion (a) is best. Para a consulta SELECT * FROM t WHERE [Col_char(30)] > @p, varchar (8000) ainda é escolhido porque causa uma conversão de tipo (b) e porque outra opção (como varchar (4000) ) causaria uma conversão de tipo (d).For the query SELECT * FROM t WHERE [Col_char(30)] > @p, varchar(8000) is still chosen because it causes a type (b) conversion, and because another choice (such as varchar(4000)) would cause a type (d) conversion.

Como um exemplo final, dado um SELECT NULL + @pde consulta, int é escolhido para @p porque resulta em uma conversão de tipo (c).As a final example, given a query SELECT NULL + @p, int is chosen for @p because it results in a type (c) conversion.

PermissõesPermissions

Requer permissão para executar o argumento TSQL @.Requires permission to execute the @tsql argument.

ExemplosExamples

O exemplo a seguir retorna informações como o tipo de dados esperado para os parâmetros não declarados @id e @name.The following example returns information such as the expected data type for the undeclared @id and @name parameters.

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

Quando o parâmetro @id é fornecido como uma referência @params, o parâmetro @id é omitido do conjunto de resultados e somente o parâmetro @name é descrito.When the @id parameter is provided as a @params reference, the @id parameter is omitted from the result set and only the @name parameter is described.

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'  
  

Consulte tambémSee Also

sp_describe_first_result_set (Transact-SQL) sp_describe_first_result_set (Transact-SQL)
sys.dm_exec_describe_first_result_set (Transact-SQL) sys.dm_exec_describe_first_result_set (Transact-SQL)
sys.dm_exec_describe_first_result_set_for_object (Transact-SQL)sys.dm_exec_describe_first_result_set_for_object (Transact-SQL)