動的SQLはSQLストアドプロシージャで一時テーブルに結果
-
20-08-2019 - |
質問
コードは
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
これが、お役に立てば幸い ジェシー
グローバル一時テーブル溶液を注意してください...
動的名で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文を形成することができますか?あなたが好きなあなたに多くの列を追加することができます。
その方法