Ver Mensaje Individual
  #23 (permalink)  
Antiguo 23/05/2013, 10:19
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: [Transact-SQL] Consulta con parámetro en SELECT

para empezar ese query no es tuyo o si?? ;), a mi me funciono una auditoria parecida a la que te puse en el ejemplo digo un poco rudimentaria(eso de usar ifs y demas) pero funcional y entendible jejeje, con el codigo entiendo que es lo que quieres lograr :)

y aqui esta la respuesta :)

Código SQL:
Ver original
  1. CREATE TABLE pruebas
  2. (
  3. id INT PRIMARY KEY,
  4. nombre VARCHAR(20)
  5. )
  6.  
  7. INSERT INTO pruebas VALUES (1,'Libras')
  8. INSERT INTO pruebas VALUES (2,'Yo')
  9. INSERT INTO pruebas VALUES (3,'Tu')
  10. INSERT INTO pruebas VALUES (4,'Mama')
  11. INSERT INTO pruebas VALUES (5,'Nos')
  12.  
  13.  
  14. ALTER TRIGGER [dbo].[triggerC] ON pruebas FOR INSERT, UPDATE, DELETE
  15. AS
  16.  
  17. DECLARE @bit INT ,    
  18.         @FIELD INT ,    
  19.         @maxfield INT ,    
  20.         @CHAR INT ,    
  21.         @fieldname VARCHAR(128) ,    
  22.         @TableName VARCHAR(128) ,    
  23.         @PKCols VARCHAR(1000) ,    
  24.         @SQL VARCHAR(2000),    
  25.         @UpdateDate VARCHAR(21) ,    
  26.         @UserName VARCHAR(128) ,    
  27.         @TYPE CHAR(1) ,    
  28.         @PKSELECT VARCHAR(1000),
  29.         @cambios VARCHAR(MAX),
  30.         @fielddCambios VARCHAR(MAX),
  31.         @fieldiCambios VARCHAR(MAX)
  32.    
  33. SELECT @TableName = 'pruebas' --<-- cambiar el nombre de la tabla
  34.  
  35. -- Fecha y Usuario
  36. SELECT @UserName = system_user ,
  37.        @UpdateDate = CONVERT(VARCHAR(8), getdate(), 112) +
  38.                      ' ' +
  39.                      CONVERT(VARCHAR(12), getdate(), 114)
  40.  
  41. SET NoCount ON
  42.  
  43. -- Identificar que evento se está ejecutando (Insert, Update o Delete)
  44. --en base a cursores especiales (inserted y deleted)
  45. IF EXISTS (SELECT * FROM inserted)
  46.   IF EXISTS (SELECT * FROM deleted) --Si es un update
  47.     SELECT @TYPE = 'U'
  48.   ELSE                              --Si es un insert
  49.     SELECT @TYPE = 'I'
  50. ELSE                                --si es un delete
  51.     SELECT @TYPE = 'D'
  52.    
  53. -- Obtenemos la lista de columnas de los cursores
  54. SELECT * INTO #ins FROM inserted
  55. SELECT * INTO #del FROM deleted
  56.    
  57. -- Obtener las columnas de llave primaria
  58. SELECT @PKCols = COALESCE(@PKCols + ' and', ' on') +
  59.        ' i.' +
  60.        c.COLUMN_NAME + ' = d.' +
  61.        c.COLUMN_NAME
  62.  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
  63.   JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
  64.   ON c.TABLE_NAME = pk.TABLE_NAME
  65.   AND c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
  66.  WHERE pk.TABLE_NAME = @TableName AND
  67.   pk.CONSTRAINT_TYPE = 'PRIMARY KEY'
  68.    
  69. -- Obtener la llave primaria y columnas para la inserción en la tabla de auditoria
  70. SELECT
  71.  @PKSELECT = COALESCE(@PKSelect+'+','') +
  72.  '''<' +
  73.  COLUMN_NAME +
  74.  '=''+convert(varchar(100),coalesce(i.' +
  75.  COLUMN_NAME +',d.' +
  76.  COLUMN_NAME + '))+''>'''
  77.  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk  
  78.  JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
  79.   ON c.TABLE_NAME = pk.TABLE_NAME
  80.   AND c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
  81.  WHERE pk.TABLE_NAME = @TableName
  82.   AND CONSTRAINT_TYPE = 'PRIMARY KEY'
  83.  
  84.    
  85. IF @PKCols IS NULL --<-- Este trigger solo funciona si la tabla tiene llave primaria
  86.  BEGIN
  87.   RAISERROR('no PK on table %s', 16, -1, @TableName)
  88.   RETURN
  89.  END
  90.    
  91. --Loop para armar el query de inserción en la tabla de log.
  92. --Un registro por cada campo afectado.
  93. SELECT
  94.  @FIELD = 0,
  95.  @maxfield = MAX(ORDINAL_POSITION)
  96.  FROM INFORMATION_SCHEMA.COLUMNS
  97.  WHERE TABLE_NAME = @TableName
  98.    
  99. while @FIELD < @maxfield
  100.  BEGIN
  101.   SELECT @FIELD = MIN(ORDINAL_POSITION)
  102.    FROM INFORMATION_SCHEMA.COLUMNS
  103.    WHERE TABLE_NAME = @TableName AND ORDINAL_POSITION > @FIELD
  104.   SELECT @bit = (@FIELD - 1 )% 8 + 1
  105.   SELECT @bit = POWER(2,@bit - 1)
  106.   SELECT @CHAR = ((@FIELD - 1) / 8) + 1
  107.   IF SUBSTRING(COLUMNS_UPDATED(),@CHAR, 1) & @bit > 0 OR @TYPE IN ('I','D')
  108.    BEGIN
  109.      SELECT @fieldname = COLUMN_NAME
  110.       FROM INFORMATION_SCHEMA.COLUMNS
  111.       WHERE TABLE_NAME = @TableName AND ORDINAL_POSITION = @FIELD
  112.      print @fieldname
  113.      /*DECLARE        
  114.      @querycafe1 nvarchar(MAX),
  115.      @querycafe2 nvarchar(MAX),
  116.      @valorViejo varchar(MAX),    
  117.      @valorNuevo varchar(MAX)
  118.      
  119.      SET @querycafe1 = 'SELECT ' + @fieldname + ' INTO #temp1 FROM #del d'
  120.      SET @querycafe2 = 'SELECT ' + @fieldname + ' INTO #temp2 FROM #ins i'
  121.      Exec(@querycafe1)
  122.      Exec(@querycafe2)
  123.      --NO FUNCIONAN
  124.      SET @valorViejo = (SELECT[*] FROM #temp1)
  125.      SET @valorNuevo = (SELECT[*] FROM #temp2)]
  126.      
  127.      --Esto es lo que hay que armar, una cadena de texto.*/
  128.      DECLARE @query Nvarchar(MAX)
  129.      SET @cambios=''
  130.    
  131.      --SELECT @cambios = @cambios + ', ' + @fieldname + ' de ' + ' convert(varchar(1000),d.' + @fieldname + ') a ' + ' convert(varchar(1000),i.' + @fieldname + ')'  from #ins as i full outer join
  132.      SET @query='
  133.     select ' + CHAR(39) +  @fieldname + 'cambio de ' + CHAR(39) + ' + convert(varchar(1000),d.' + @fieldname + ') + ' + CHAR(39) + ' a ' + CHAR(39) + ' + convert(varchar(1000),i.' + @fieldname + ')' + ' from #ins i full outer join #del d ' + @PKCols
  134.      + ' where i.' + @fieldname + '<> d.' + @fieldname
  135.      
  136.      --print @query
  137. EXECUTE sp_executesql @query
  138.      
  139. END    
  140. END
  141.  
  142. UPDATE pruebas
  143. SET nombre='aqui'
  144. WHERE id=5

Ojo estoy usando una tabla llamada pruebas adecualo a tus necesidades
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me