Pregunta

Necesito recorrer los campos en una tabla y hacer algo si su valor no es igual a su valor predeterminado.

Estoy en un desencadenante y sé el nombre de la tabla. Luego recorro cada uno de los campos que usan este bucle:

select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

Entonces puedo obtener el nombre del campo en cada iteración a través del bucle:

select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

Y puedo obtener el valor predeterminado para esa columna:

select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

Tengo todo lo que necesito pero no puedo ver cómo comparar el 2. Porque No tengo el nombre del campo como una constante, solo en una variable, no puedo ver cómo obtener el valor de la tabla 'insertada' (recuerde que estoy en un disparador) para ver si es el mismo que el valor predeterminado (mantenido ahora en @ColDefault como varchar).

¿Fue útil?

Solución

Primero, recuerde que un disparador puede dispararse con múltiples registros entrando simultáneamente. Si hago esto:

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

entonces mi disparador en MyTableWithTrigger necesitará manejar más de un registro. El " insertado " pseudotable tendrá más de un solo registro.

Dicho esto, para comparar los datos, puede ejecutar una declaración de selección como esta:

DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

Eso devolverá todas las filas del pseudotable insertado que no coinciden con los valores predeterminados. Parece que quiere HACER algo con esas filas, por lo que lo que puede hacer es crear una tabla temporal antes de llamar a esa cadena @sqlToExec y, en lugar de simplemente seleccionar los datos, insertarlos en la tabla temporal. Luego puede usar esas filas para hacer cualquier manejo de excepciones que necesite.

Una trampa: este T-SQL solo funciona para campos numéricos. Probablemente desee crear un manejo separado para diferentes tipos de campos. Es posible que tenga varchars, numéricos, blobs, etc., y necesitará diferentes formas de compararlos.

Otros consejos

Sospecho que puedes hacer esto usando y exec.

Pero, ¿por qué no solo generar código una vez? Será más eficiente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top