Laden...

SQL Trigger Inserted Row to CSV String

Erstellt von Ristor vor 10 Jahren Letzter Beitrag vor 10 Jahren 928 Views
R
Ristor Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren
SQL Trigger Inserted Row to CSV String

Hallo Zusammen,

ich muss einem externen Konsolenprogramm aus einem Datenbanktrigger einen CSV string übergeben.

Nun muss ich irgend einen weg finden wie ich die inserted row zu einem CSV-String konvertiere.

Die Daten stammen aus verschiedenen Produktionsanlagen verschiedener Hersteller und Produkten deshalb werde ich nie wissen wie viele Spalten es sind. (Auch die Namen kenne ich nicht)

Die Daten könnten wie folg aussehen:

spalte1 spalte2 spalte3 etc.
123 55 88 .....

und ich bräuchte -> 123;55;88

Kann mir jemand einen Denkanstoß geben bzw ein schönen link 😃

Gruß,
Ristor

3.511 Beiträge seit 2005
vor 10 Jahren

Hallo,

verstehe ich dich richtig, dass du nicht weißt, welche Columns in der inserted Tabelle vorhanden sind? Dann wird es schwierig. Du kannst die Tabelle als XML konvertieren und anschließend per XPath dir wieder die einzelnen Werte holen. Das ist für ein Trigger aber alles andere als performant.

Wenn du die Columns kennst, kannst du die CSV Zeile einfach selber zusammenschustern. Ist nicht unbedingt die eleganteste Art, aber die effizienteste.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

R
Ristor Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Hi,

also ich kenne die Spalten nicht direkt...
Es ist so das die x00 Maschinen, auf 3 Kontinente verteilt sind.
Falls irgend ein Hersteller Spalten hinzufügt etc. müsste ich jedesmal den
Trigger anfassen, das wollte ich vermeiden indem ich den Trigger
"universell" gestalte.

Eine andere Möglichkeit wäre, das der Trigger einen Webservice anspricht.

Aber SQL -> Webservice ich weiss nicht geht das gut? 😛
Oder doch lieber die schusterei... 😄

L
416 Beiträge seit 2008
vor 10 Jahren

Das sollte doch mit einem Cursor machbar sein.
So wie hier

R
Ristor Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Hi Lennart,

vielen Dank für den Link.

Ich habs wie folgt hinbekommen 😄
Ob es Produktiv passt wird sich Zeigen 😉..
Auf Performance kommt es Gott sei Dank nicht an.

Gruß
Ristor


USE [xxx]
GO
/****** Object:  Trigger [dbo].[xxx]    Script Date: 09.12.2013 16:22:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[xxx] 
   ON  [xxx].[dbo].[xxx]
   AFTER INSERT
AS 


BEGIN
SET NOCOUNT ON;

DECLARE @TableName nvarchar(500)
Set @TableName='xxx'



DECLARE @ColumnName nvarchar(500)
DECLARE @value nvarchar(500)
DECLARE @Sql nvarchar(500)
DECLARE @PData nvarchar(500)
Set @PData = ' '

Set @TableName='xxx'

DECLARE ColumnsCursor CURSOR FOR
select column_name FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME = @TableName

OPEN ColumnsCursor
FETCH NEXT FROM ColumnsCursor into @ColumnName

WHILE @@FETCH_STATUS=0
BEGIN 

      select * into #tmp from  inserted
      Set @Sql= ' 	SET NOCOUNT ON; SELECT @value =' + @ColumnName + ' FROM #tmp'

      EXEC sp_executesql @Sql, N'@Value nvarchar(500) OUTPUT', @Value OUTPUT


      DROP TABLE #TMP

	  Set @PData = @PData + '#Value#' +@ColumnName
	  set @PData = @PData + '#Column#' + @Value
      FETCH NEXT FROM ColumnsCursor into @ColumnName
END   

CLOSE ColumnsCursor
DEALLOCATE ColumnsCursor

declare @cmd varchar(8000)
set @cmd = 'c:\xxx\test.bat '  +  @PData

Exec master..xp_cmdshell @cmd , NO_OUTPUT

END

3.511 Beiträge seit 2005
vor 10 Jahren

Wenn du den Tabellennamen nicht für jeden Trigger setzen willst, kannst du diesen aus dem Trigger auslesen via


SELECT OBJECT_SCHEMA_NAME( parent_id ) + '.' + OBJECT_NAME( parent_id ) tableName FROM sys.triggers WHERE object_id = @@PROCID

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

R
Ristor Themenstarter:in
24 Beiträge seit 2009
vor 10 Jahren

Perfekt Danke dir 😃

edit: das dbo. muss noch entfernt werden