2016-04-23 13 views
0

SQLクエリの返されたスキーマからテーブルを作成する必要があります。ここでは、SQLクエリには複数の結合があります。 例 - 以下のシナリオでは、列 'r'のテーブルスキーマを作成します& 't'。私は、入力文を選択し、SQL取得し、実行時に送信先テーブルにそのクエリの出力をコピーする必要があるためSQLクエリのスキーマを使用してテーブルを作成する

select a.x as r b.y as t 
from a 
JOIN b 
ON a.m = b.m 

私は「ステートメントに選択」を使用することはできません。

+0

あなたはinsert into節を探しているようです。 –

答えて

0

、あなたは外部ソースからのSQLを取得している、あなたは(多分なし、多分データで)テーブルにそれを実行したいです。これは、実行する必要があります。

use tempdb; 
declare @userSuppliedSQL nvarchar(max) = N'select top 10 * from Util.dbo.Numbers'; 

declare @sql nvarchar(max); 

set @sql = concat(' 
with cte as (
', @userSuppliedSQL, ' 
) 
select * 
into dbo.temptable 
from cte 
where 9=0 --delete this line if you actually want data 
;'); 
print @sql 

exec sp_executesql @sql; 
select * from dbo.temptable; 

これは、供給されたクエリは、共通テーブル式(例えば、すべての列の名前とユニークされている)のボディとして使用するための法的であることを前提としています。一時表はsp_executesql呼び出しの間だけ存在するため、一時表(#temp)を選択できないことに注意してください。

また、聖なるものを愛するために、ユーザーが渡す任意のSQLを実行することによって、自分自身をSQLインジェクションまで開いていることを理解してください。

+1

私はSQLインジェクションのリスクを理解しており、他のサービスラインチームがユーザーの要求を受け入れてくれています。 –

0

ここではinto句を使用します。 Like

Select col1, col2, col3 
into newtable 
from old table; 

select a.x as r b.y as t 
into c 
from a 
JOIN b ON a.m = b.m 
+0

最初に構造体を作成してから使用することをお勧めします。したがって、決して満足できない条件を使用する必要があります。 –

0

私はあなたが選択できないと知っていますが、空のテーブル構造を作成してから挿入することができますか?私が正しくあなたの問題を読んでいる場合

select a.x as r b.y as t 
into TABLE 
from a 
JOIN b 
ON a.m = b.m 
where 0 = 1