|
Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original.
|
Traducción
Original
|
sp_describe_undeclared_parameters (Transact-SQL)
|
|
|
|
|---|---|---|
|
|
int NOT NULL |
|
|
|
sysname NOT NULL |
|
|
|
int NOT NULL |
|
|
|
nvarchar (256) NULL |
|
|
|
smallint NOT NULL |
|
|
|
tinyint NOT NULL |
|
|
|
tinyint NOT NULL |
|
|
|
int NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
nvarchar (4000) NULL |
|
|
|
int NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
sysname NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
bit NOT NULL |
|
|
|
sysname NULL |
|
|
|
int NOT NULL |
|
|
|
int NOT NULL |
|
-
Si la entrada @tsql no es un lote de Transact-SQL válido. La validez se determina analizando el lote de Transact-SQL. Los errores que ocasione el lote durante la optimización o la ejecución de consultas no se consideran al determinar si el lote de Transact-SQL es válido. -
Si @params no es NULL y contiene un cadena que no es una cadena de declaración sintácticamente válida para los parámetros o si contiene una cadena que declara algún parámetro más de una vez. -
Si el lote de Transact-SQL de entrada declara una variable local con el mismo nombre que un parámetro declarado en @params. -
Si la instrucción crea alguna tabla temporal.
Algoritmo de selección de parámetros
Paso 1
-
Columnas, constantes, variables y parámetros declarados. -
Los resultados de una llamada a una función definida por el usuario (UDF). -
Una expresión con tipos de datos que no dependen de los parámetros no declarados para todas las entradas.
SELECT * FROM t1 WHERE @p1 = @p2 SELECT * FROM t1 WHERE c1 = @p1 + @p2 SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3)
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3)
Paso 2
Un argumento de un operador de asignación o comparación. Un argumento de una función definida por el usuario (incluido un UDF con valor de tabla), procedimiento o método. Un argumento de una cláusula VALUES de una instrucción INSERT. Un argumento de CAST o CONVERT.
El tipo de datos del otro lado de la comparación o asignación. El tipo de datos declarado del parámetro al que se pasa este argumento. El tipo de datos de la columna en la que se inserta este valor. El tipo de datos al que la instrucción se va a convertir.
Paso 3
Deducción simple Si E(@p) = @p y TT(@p) existe, es decir, si @p es directamente un argumento de una de las expresiones enumeradas al principio del paso 2, el algoritmo de deducción de tipo deduce el tipo de datos de @p para ser TT(@p). Por ejemplo: SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3)
El tipo de datos para @p1, @p2 y @p3 será el tipo de datos de c1, el tipo de datos devuelto de dbo.tbl y el tipo de datos de parámetro para dbo.tbl respectivamente. Como caso especial, si @p es un argumento de un operador <, >, <= o >=, las reglas de deducción simples no se aplican. El algoritmo de deducción de tipo utilizará las reglas de deducción generales explicadas en la sección siguiente. Por ejemplo, si c1 es una columna del tipo de datos char(30), considere las siguientes dos consultas: SELECT * FROM t WHERE c1 = @p SELECT * FROM t WHERE c1 > @p
En el primer caso, el algoritmo de deducción de tipo deduce char(30) como tipo de datos para @p según las reglas anteriores de este tema. En el segundo caso, el algoritmo de deducción de tipo deduce varchar(8000) según las reglas de deducción generales de la sección siguiente. Deducción general Si la deducción simple no se aplica, los siguientes tipos de datos se consideran para los parámetros no declarados: Tipos de datos enteros (bit, tinyint, smallint, int, bigint) Tipo de datos money (smallmoney, money) Tipos de datos de coma flotante (float, real) numeric(38, 19) : otros tipos de datos numéricos o decimales no se consideran. varchar(8000) , varchar(max), nvarchar(4000) y nvarchar(max): otros tipos de datos de cadena (como text, char(8000), nvarchar(30), etc.) no se consideran. varbinary(8000) y varbinary(max): otros tipos de datos binarios no se consideran (como image, binary(8000), varbinary(30), etc.). date , time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7): otros tipos de fecha y hora, como time(4), no se consideran. sql_variant
xml
Tipos definidos por el sistema CLR (hierarchyid, geometry, geography) Tipos definidos por el usuario CLR
Criterios de selección
Se selecciona el tipo de datos que genera el menor número de conversiones implícitas en E(@p). Si un tipo de datos determinado genera un tipo de datos para E(@p) que es diferente de TT(@p), el algoritmo de deducción de tipo considera que es una conversión implícita adicional del tipo de datos E(@p) a TT(@p). Por ejemplo: SELECT * FROM t WHERE Col_Int = Col_Int + @p
En este caso, E(@p) es Col_Int + @p y TT(@p) es int. Se elige int para @p porque no genera ninguna conversión implícita. Cualquier otra opción de tipo de datos genera al menos una conversión implícita. Si hay varios tipos de datos que coinciden en el número menor de conversiones, se utiliza el tipo de datos con mayor prioridad. Por ejemplo SELECT * FROM t WHERE Col_Int = Col_smallint + @p
En este caso, int y smallint generan una conversión. Otros tipos de datos generan más de una conversión. Dado que int tiene precedencia sobre smallint, int se utiliza para @p. Para obtener más información acerca de la precedencia de los tipos de datos, vea Prioridad de tipo de datos (Transact-SQL). Esta regla solo se aplica si hay una conversión implícita entre cada tipo de datos que coincide según la regla 1 y el tipo de datos con la precedencia máxima. Si no hay ninguna conversión implícita, la deducción del tipo de datos no se puede realizar y genera un error. Por ejemplo, en la consulta SELECT @p FROM t, la deducción del tipo de datos no se puede realizar porque cualquier tipo de datos para @p sería igual de bueno. Por ejemplo, no hay ninguna conversión implícita de int a xml. Si dos tipos de datos similares cumplen la regla 1, por ejemplo varchar(8000) y varchar(max), se elige el menor (varchar(8000)). El mismo principio se aplica a los tipos de datos nvarchar y varbinary. Para los fines de la regla 1, el algoritmo de deducción de tipo prefiere ciertas conversiones sobre otras. Las conversiones, en orden de mejor a peor, son: Conversión entre el mismo tipo de datos básico de longitud diferente. Conversión entre la versión de longitud fija y la de longitud variable de los mismos tipos de datos (por ejemplo, char a varchar). Conversión entre NULL e int. Cualquier otra conversión.
sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes WHERE object_id = @id OR name = @name'
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'
