Problem mit OPENROWSET und UserDefined Table Type (MSSQL)
Hallo,
ich möchte Daten von einem Server zum anderen einfügen.
Die Prozedur auf dem Zielserver erwartet einen UserDefined Table Type.
Diesen habe ich bereits auf dem Quellserver angelegt:
Prozedur Zielserver:
Aufruf Quellserver:
Auf beiden Servern existiert der Datentyp
Folgender Fehler erscheint bei Ausführung:
Msg 352, Level 15, State 1, Line 5
Der '@tp_IF_Abrechnungsdaten_IN'-Tabellenwertparameter muss mit der Option READONLY deklariert werden.
Kann mir bitte jemand sagen, was ich hier falsch mache ?
Ich bin schon am verzweifeln.
Wird der Datentyp auf der Seite des Quellservers überhaupt benötigt oder kann MSSQL diesen auch irgendwei konvertieren ?
Für Eure Hilfe wäre ich sehr dankbar
Gruss Stefan
ich möchte Daten von einem Server zum anderen einfügen.
Die Prozedur auf dem Zielserver erwartet einen UserDefined Table Type.
Diesen habe ich bereits auf dem Quellserver angelegt:
Prozedur Zielserver:
ALTER PROCEDURE [dbo].[IF_Abrechnungsdaten_IN_Batch_put]
@tIF_Abrechnungsdaten_IN tp_IF_Abrechnungsdaten_IN READONLY
AS
INSERT INTO [dbo].XYZ
(
Mandant
,[ProjektID]
,[Lieferdatum]
,[Kontraktposition]
,[Zielmenge]
,[Einzelpreis]
)
SELECT
Mandant
,[ProjektID]
,[Lieferdatum]
,[Kontraktposition]
,[Zielmenge]
,[Einzelpreis]
FROM
@tIF_Abrechnungsdaten_IN
Aufruf Quellserver:
DECLARE @tp_IF_Abrechnungsdaten_IN AS tp_IF_Abrechnungsdaten_IN
INSERT INTO @tp_IF_Abrechnungsdaten_IN
(Mandant,ProjektID,Lieferdatum,Kontraktposition,Zielmenge,Einzelpreis)
SELECT blablablaba
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT *
FROM OPENROWSET(''SQLNCLI'',
''DRIVER={SQL Server};SERVER=server;UID=uid;PWD=password'',
''EXEC [Datenbankname].[dbo].[IF_Abrechnungsdaten_IN_Batch_put] @tp_IF_Abrechnungsdaten_IN '')'
EXECUTE sp_executesql
@SQL
,N'@tp_IF_Abrechnungsdaten_IN dbo.tp_IF_Abrechnungsdaten_IN '
,@tp_IF_Abrechnungsdaten_IN
Auf beiden Servern existiert der Datentyp
CREATE TYPE [dbo].[tp_IF_Abrechnungsdaten_IN] AS TABLE(
[Mandant] [char](7) NOT NULL,
[ProjektID] [int] NOT NULL,
[Lieferdatum] [date] NOT NULL,
[Kontraktposition] [int] NOT NULL,
[Zielmenge] [int] NOT NULL,
[Einzelpreis] [decimal](11, 2) NULL
)
Folgender Fehler erscheint bei Ausführung:
Msg 352, Level 15, State 1, Line 5
Der '@tp_IF_Abrechnungsdaten_IN'-Tabellenwertparameter muss mit der Option READONLY deklariert werden.
Kann mir bitte jemand sagen, was ich hier falsch mache ?
Ich bin schon am verzweifeln.
Wird der Datentyp auf der Seite des Quellservers überhaupt benötigt oder kann MSSQL diesen auch irgendwei konvertieren ?
Für Eure Hilfe wäre ich sehr dankbar
Gruss Stefan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 393407
Url: https://administrator.de/contentid/393407
Ausgedruckt am: 16.11.2024 um 11:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo Stefan,
ich nehme mal an, der Fehler rührt nicht von Deiner Prozedur, sondern von sp_executesql.
Ist also schon mal die Frage, warum Du das mit dynamischem SQL machst?
Außerdem verwendest Du eine Rowsetfunktion, die verwendet man für select (andere auch für insert, update, delete) und nicht für den Aufruf von Prozeduren.
Schon mal an Verbindungsserver gedacht?
Gruß, Mad Max
ich nehme mal an, der Fehler rührt nicht von Deiner Prozedur, sondern von sp_executesql.
Ist also schon mal die Frage, warum Du das mit dynamischem SQL machst?
Außerdem verwendest Du eine Rowsetfunktion, die verwendet man für select (andere auch für insert, update, delete) und nicht für den Aufruf von Prozeduren.
Schon mal an Verbindungsserver gedacht?
Gruß, Mad Max
Hallo Stefan,
dann gibt es noch zwei Möglichkeiten für Dich:
1. Du verwendest für die Übergabe keine Tabelle, sondern XML oder CSV.
2. Du fügst es ohne den Umweg über die Prozedur direkt ein, das geht mit openrowset oder opendatasource ja auch.
insert into openrowset ('sqlncli', 'Server=server;UID=uid;PWD=password', 'select * from Datenbankname.dbo.XYZ') (Mandant, ProjektID, ...)
select ...
oder
insert into opendatasource ('sqlncli', 'Data Source=server;User ID=uid;Password=password').Datenbankname.dbo.XYZ (Mandant, ProjektID, ...)
select ...
Gruß, Mad Max
dann gibt es noch zwei Möglichkeiten für Dich:
1. Du verwendest für die Übergabe keine Tabelle, sondern XML oder CSV.
2. Du fügst es ohne den Umweg über die Prozedur direkt ein, das geht mit openrowset oder opendatasource ja auch.
insert into openrowset ('sqlncli', 'Server=server;UID=uid;PWD=password', 'select * from Datenbankname.dbo.XYZ') (Mandant, ProjektID, ...)
select ...
oder
insert into opendatasource ('sqlncli', 'Data Source=server;User ID=uid;Password=password').Datenbankname.dbo.XYZ (Mandant, ProjektID, ...)
select ...
Gruß, Mad Max