Announcement

Collapse
No announcement yet.

StoredProcedure mit Dynamic SQL und Rückgabetyp

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • StoredProcedure mit Dynamic SQL und Rückgabetyp

    Hallo Leute,

    ich nutze MS SQL Server 2008 R2. Ich habe eine StoredProcedure, die ein gefiltertes select auf eine Tabelle ausführt. Der Filter wird der SP über einen Parameter übergeben. Ich muss das select mit Filter als dynamic SQL ausführen, um auch Spaltennamen als Filter nutzen zu können:

    Code:
    USE [LpcAutomation]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[usp_GetBarcode] 
    	@Filter nvarchar(max)	
    AS
    BEGIN
    	SET NOCOUNT ON;
    
    	DECLARE @sql nvarchar(max)
    	SET @sql = 'SELECT TOP (100) PERCENT dbo.Barcode.ID, dbo.Barcode.BarcodeNumber,
                        dbo.Barcode.AssociatedMaterialInfo FROM dbo.Barcode'
    						  
    	-- Adds filter, if given
    	IF @Filter <> '' SET @sql = 'SELECT * FROM (' + @sql + ') as a WHERE ' + @Filter
    
    	EXEC(@sql)	
    END
    GO
    Die SP funktioniert ohne Probleme, Filter wie z.B. "BarcodeNumber=4711" können injected werden.

    Der Aufruf SP passiert in C# über das Entity Framework. Wenn ich im Entity Data Model die SP aus der Datenbank importiere bekomme ich keinen Rückgabetyp, da die SP ja dynamisches SQL beinhaltet. Ich muss also den komplexen Rückgabetyp von Hand erstellen.

    Gibt es keine Möglichkeit in der SP, einen Rückgabetyp zu deklarieren, den ich im Entity Data Model importieren kann? Das würde auch auf Datenbankebene weiterhelfen, wenn ich die SP noch an einem anderen Ort aufrufe.
    Ich habe diverse Versuche mit einem User Defined Table Type unternommen, z.B.

    Code:
    USE [LpcAutomation]
    GO
    CREATE TYPE [dbo].[GetBarcodeResult] AS TABLE(
    	[ID] [uniqueidentifier] NOT NULL,
    	[BarcodeNumber] [nvarchar](max) NOT NULL,
    	[AssociatedMaterialInfo] [nvarchar](max) NULL,
    	PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (IGNORE_DUP_KEY = OFF)
    )
    GO
    und in der SP dann

    Code:
    DECLARE @sql nvarchar(max)
    SET @sql = 'SELECT TOP (100) PERCENT dbo.Barcode.ID, dbo.Barcode.BarcodeNumber, 
                dbo.Barcode.AssociatedMaterialInfo FROM dbo.Barcode'
    
    declare @temptable GetBarcodeResult				  
    insert into @temptable EXEC(@sql)
    
    select * from @temptable
    Das funktioniert auf Datenbankebene ja gut; wenn ich die SP allerdings von C# aus aufrufen will kommt die Fehlermeldung "Eine INSERT EXEC-Anweisung kann nicht geschachtelt werden."

    Habt ihr eine Idee? VIELEN DANK!

  • #2
    Vielleicht könnte man die Zieltabelle als temporäre Tabelle anlegen, dann die per exec gelesenen Daten in diese Tabelle stellen und am Schluss ein select * from tempTable machen (etwa so wie hier beschrieben).

    bye,
    Helmut

    Comment

    Working...
    X