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-ID: 393407

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

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

MadMax
MadMax 21.11.2018 um 19:15:19 Uhr
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
StefanLausL
StefanLausL 21.11.2018 um 19:28:31 Uhr
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
MadMax
MadMax 22.11.2018 um 17:46:56 Uhr
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
StefanLausL
StefanLausL 22.11.2018 um 19:10:00 Uhr
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