質問

次のように

コードは

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

問題は、私は別の列をお返しすることができます別のプロシージャを呼び出すしたいということです。 したがって、私は一般的にテーブル#のT1を定義する必要があります。 しかし、私は方法がわからない。

誰もがこの問題で私を助けることはできますか?

役に立ちましたか?

解決

試します:

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

これは、SQLインジェクションの脆弱性のような本当の臭います。

<時間>

を修正の(@カルペディエムさんのコメントあたり):

INSERT into #T1 execute ('execute ' + @SQLString )
SQL文字列は手順

以外のものである場合は、

また、'execute'を省略

他のヒント

あなたが動的にそれに挿入されているだけのように動的テーブルを定義することができますが、問題は一時テーブルのスコープです。例えば、このコード:

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

エラーを返します「無効なオブジェクト名 『#のT1』。」一時テーブル#T1は、コードを実行するブロックよりも「低いレベル」で作成されるためです。固定するために、グローバルな一時テーブルを使用します:

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

これが、お役に立てば幸い ジェシー

2人のユーザーがグローバルな一時テーブルは、すべてのユーザーが見ることができると同時に同じルーチンを使用している場合、これは失敗する可能性として

グローバル一時テーブル溶液を注意してください...

動的名でGUIDを持つグローバルな一時テーブルを作成します。その後、同じSPROCを呼び出して、別のプロセスがそれを使用することを心配することなく、DYNのSQLを経由して、あなたのコードで作業することができます。あなたは基礎となる選択されたテーブルから明示的に事前に一時テーブルを作成することはできませんので、それが実行されるたびに期待するものを知らない場合に便利です。すなわち - あなたは構文INTO SELECT *を使用する必要があります。

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

ない私はよく理解してください、しかし、多分あなたは、その文字列を実行し、文字列内のCREATE文を形成することができますか?あなたが好きなあなたに多くの列を追加することができます。

その方法
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top