stefanlausl
Goto Top

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:

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

Content-Key: 393407

Url: https://administrator.de/contentid/393407

Printed on: April 19, 2024 at 23:04 o'clock

Member: MadMax
MadMax Nov 21, 2018 at 18:15:19 (UTC)
Goto Top
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
Member: StefanLausL
StefanLausL Nov 21, 2018 at 18:28:31 (UTC)
Goto Top
Hallo,

Leider ist der Kollege der Berechtigungen hätte einen linked Server einzurichten im Urlaub.
Insofern wollte ich es so probieren.

OpenRowset sollte auch zum ausführen von SPs funktioniern.
Problem ist wohl eher der Table Type.

TSql deswegen weil ich nicht mit dem Übergabe Parameter zurecht komme.
Anders funktioniert es gar nicht.
Da kommen noch mehr Fehler
Member: MadMax
MadMax Nov 22, 2018 at 16:46:56 (UTC)
Goto Top
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
Member: StefanLausL
StefanLausL Nov 22, 2018 at 18:10:00 (UTC)
Goto Top
Den direkten insert bekommt ich hin.
Die Prozedur sollte aber als Schnittstelle fungieren.

Ich habe jetzt einem linked Server verfügbar.
Sollte also jetzt so klappen.

Danke für die Hilfe