Frage

Der Code lautet wie folgt:

ALTER PROCEDURE dbo.pdpd_DynamicCall 
@SQLString varchar(4096) = null

AS

Begin

    create TABLE #T1 ( column_1 varchar(10) , column_2 varchar(100) )

    insert into #T1 
        execute ('execute ' + @SQLString )

    select * from #T1 

End

Das Problem ist, dass ich verschiedene Verfahren nennen wollen, die verschiedenen Spalten zurückgeben kann. Deshalb würde ich allgemein die Tabelle # T1 definieren. Aber ich weiß nicht, wie.

Kann mir jemand auf diesem Problem helfen?

War es hilfreich?

Lösung

Versuchen:

SELECT into #T1 execute ('execute ' + @SQLString )

Und das riecht wirklich schlecht wie eine SQL-Injection-Schwachstelle.


Korrektur (pro @ Carpediem Kommentar):

INSERT into #T1 execute ('execute ' + @SQLString )

auch, lassen Sie den 'execute' wenn die SQL-Zeichenfolge etwas anderes als ein Verfahren ist

Andere Tipps

Sie können eine Tabelle definieren dynamisch wie man in sie einfügen, dynamisch, aber das Problem ist mit dem Umfang der temporären Tabellen. Zum Beispiel dieses Code:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE #T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO #T1 (Col1) VALUES ('This will not work.')
SELECT * FROM #T1

wird wieder mit dem Fehler „Ungültiger Objektname‚# T1‘.“ Dies liegt daran, dass die # T1 Temptabelle auf einer „unteren Ebene“ angelegt ist als der Block von Code ausführt. Um eine globale temporäre Tabelle zu beheben, verwenden Sie:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO ##T1 (Col1) VALUES ('This will work.')
SELECT * FROM ##T1

Hope, das hilft, Jesse

Seien Sie vorsichtig, eine globalen temporäre Tabelle Lösung, da dies fehlschlagen, wenn zwei Benutzer die gleiche Routine zur gleichen Zeit verwenden, wie eine globale temporäre Tabelle von allen Benutzern gesehen werden kann ...

eine globale temporäre Tabelle mit einer GUID in dem dynamisch Namen erstellen. Dann können Sie damit in Ihrem Code arbeiten, über dyn SQL, ohne Sorge, dass ein anderer Prozess gleiche sproc Aufruf wird es verwenden. Dies ist nützlich, wenn Sie nicht wissen, was aus dem zugrunde liegenden ausgewählten Tabelle jedes Mal läuft es zu erwarten, so dass Sie nicht eine temporäre Tabelle vorher explizit erstellt werden. dh - Sie müssen SELECT * INTO-Syntax verwenden

DECLARE @TmpGlobalTable varchar(255) = 'SomeText_' + convert(varchar(36),NEWID())

-- select @TmpGlobalTable 

-- build query
    SET @Sql = 
        'SELECT * INTO [##' + @TmpGlobalTable + '] FROM SomeTable'
EXEC (@Sql)
EXEC ('SELECT * FROM [##' + @TmpGlobalTable + '] ')
EXEC ('DROP TABLE [##' + @TmpGlobalTable + ']')
PRINT 'Dropped Table ' + @TmpGlobalTable 
INSERT INTO #TempTable
EXEC(@SelectStatement)
DECLARE @EmpGroup INT =3 ,
        @IsActive BIT=1

DECLARE @tblEmpMaster AS TABLE
        (EmpCode VARCHAR(20),EmpName VARCHAR(50),EmpAddress VARCHAR(500))

INSERT INTO @tblEmpMaster EXECUTE SPGetEmpList @EmpGroup,@IsActive

SELECT * FROM @tblEmpMaster
CREATE PROCEDURE dbo.pdpd_DynamicCall 
AS
DECLARE @SQLString_2 NVARCHAR(4000)
SET NOCOUNT ON
Begin
    --- Create global temp table
    CREATE TABLE ##T1 ( column_1 varchar(10) , column_2 varchar(100) )

    SELECT @SQLString_2 = 'INSERT INTO ##T1( column_1, column_2) SELECT column_1 = "123", column_2 = "MUHAMMAD IMRON"'
    SELECT @SQLString_2 = REPLACE(@SQLString_2, '"', '''')

    EXEC SP_EXECUTESQL @SQLString_2

    --- Test Display records
    SELECT * FROM ##T1

    --- Drop global temp table 
    IF OBJECT_ID('tempdb..##T1','u') IS NOT NULL
    DROP TABLE ##T1
End

Nicht sicher, ob ich verstehe gut, aber vielleicht könnte man die Aussage in einem String CREATE bildet, dann diese Zeichenfolge ausführen? Auf diese Weise können beliebig viele Spalten hinzufügen können, wie Sie möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top