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
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)
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... 😄
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
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)