T-SQL - Seleccione los registros en texto concatenado?
-
09-09-2019 - |
Pregunta
Estoy tratando de investigar cuando y por qué ciertas filas están siendo eliminados en una base de datos SQL 2005. He comenzado la construcción de un disparador para iniciar la sesión alguna información cuando se elimina una fila.
Mi disparador se activa cuando la fila (s) se elimina de una determinada mesa. Lo tengo configurado para registrar una marca de tiempo en otra tabla de registro cuando se produce la eliminación. También me gustaría que entrar los datos que se ha eliminado, pero preferiría no molestar con la escritura de código para cada campo y el valor.
Sé que cuando se eliminan los datos se puede observar (temporalmente) en la tabla de "Eliminado" en SQL Server. Así que justo después de una eliminación, podría "SELECT * FROM Eliminado" y ver los datos. Me gustaría tomar el contenido de esta tabla, y convertirla en una burbuja de texto grande que sólo puede guardar en un campo de texto en mi mesa de registro.
Así que ... en términos más simples, hay una manera que puedo tomar un conjunto de registros de una o más filas y convertirla en una sola variable de cadena? todo dentro de los comandos SQL en mi gatillo? Los puntos de bonificación si pueden incluir nombres de columna.
Gracias
Solución
Me quedaría lejos de cualquier cosa que pudiera correr demasiado tiempo cuando se trabaja en un disparador. Eso incluye alguna consulta sólo para determinar un diseño de tabla estática (ya que no desea escribir el código usted mismo) para que pueda construir una cadena.
que hago este tipo de cosas todo el tiempo, pero sobre todo con los parámetros de procedimiento almacenado. Tengo la mayor parte de esto en una plantilla que uso.
crear esta función, se mostrará la columna muy bien entre comillas o mostrar NULL:
CREATE FUNCTION [dbo].[QuoteNull]
(
@InputStr varchar(8000) --value to pad
)
RETURNS
varchar(8000)
AS
/*
TEST WITH:
----------
PRINT ' dbo.QuoteNull(null) ->'+dbo.QuoteNull(null)+'<-'
PRINT ' dbo.QuoteNull(''apple'') ->'+dbo.QuoteNull('apple')+'<-'
PRINT ' dbo.QuoteNull(123) ->'+dbo.QuoteNull(123)+'<-'
PRINT ' dbo.QuoteNull(GETDATE()) ->'+dbo.QuoteNull(GETDATE())+'<-'
PRINT ' dbo.QuoteNull(GETDATE()) ->'+dbo.QuoteNull(CONVERT(varchar(23),GETDATE(),121))+'<-'
*/
BEGIN
RETURN COALESCE(''''+@InputStr+'''','null')
END
GO
pega esto en su código:
INSERT INTO YourLogTable
(xxx,yyy,zzz,ColumnTextValue)
SELECT
xxx,yyy,zzz,'values:'
+' '+RTRIM('ColumnNameInt ')+'='+dbo.QuoteNull( ColumnNameInt )
+', '+RTRIM('ColumnNameVarchar ')+'='+dbo.QuoteNull( ColumnNameVarchar )
+', '+RTRIM('ColumnNameChar ')+'='+dbo.QuoteNull( ColumnNameChar )
+', '+RTRIM('ColumnNameDate ')+'='+dbo.QuoteNull(CONVERT(varchar(23),ColumnNameDate ,121))
FROM DELETED
asegurarse de que tiene una fila para cada columna de la tabla (si tiene más apenas suprima los adicionales posteriores), si quieres ver cualquier fecha en detalle, utilizar el convertido como se muestra arriba.
ejecutar esta consulta:
select sc.name
FROM syscolumns sc INNER JOIN sysobjects so ON sc.id = so.id
where UPPER(so.name)=UPPER('YourTableName') order by sc.colorder desc
tomar la salida en SQL Server Management Studio (dentro del modo de salida de texto), y hacer ALT-left_click arrastrar un cuadrado sobre los nombres de las columnas, y copiar esta columna de selección basado.
Vuelve a tu código y ALT-clic y arrastrar un cuadrado sobre la completa "ColumnName ..." Los valores en la columna izquierda de la instrucción de inserción y pegar. Si ha realizado una selección de columnas, que reemplazará a la columna y dejar solamente el código sin cambios a la izquierda y la derecha. Haga lo mismo para el "ColumnName ..." valores de la derecha de la inserción y ahora tiene un INSERT que construirá los datos que desea pero no perder demasiado tiempo en el gatillo.