7

一時テーブルにデータを挿入する必要があります。

のような条件付きの列SalaryCodeがいくつかあります。

条件付き列のテーブルを作成するにはどうすればよいですか? 使いたくない SELECT INTO #tempTable

コードは次のとおりです。

DECLARE @sql NVARCHAR(MAX)
,@sqlSelect NVARCHAR(MAX) = ''
,@sqlFrom NVARCHAR(MAX) =''

CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100))


SET @sqlSelect ='INSERT INTO #myTempTable
SELECT EMP.Id, EMP.DeptId, EMP.DeptName'

SET @sqlFrom =' FROM dbo.EMPLOYEE AS EMP'

IF (someCondition)
BEGIN
    SET @sqlSelect = @sqlSelect +', EMP.Salary, EMP.Code'            
END

SET @sql =  @sqlSelect +@sqlFrom 

EXEC sp_executesql @sql

これをどのように改善できるかについてのヘルプ/提案はありますか?


アップデート:

最初SELECT INTO #TempTableは列数を指定せずに使用していましたが、SQL Azure ではサポートされていないため、 を使用することにしましたINSERT INTO。しかし、定義済みの構造に動的列を追加する方法がわかりません。その完全に動的な SQL :(

4

11 に答える 11

1

動的列はいくつ必要ですか?

Dynamicタイプなどと呼ばれる列を持つことについてはどうでしょnvarchar(MAX)うか。そうすれば、そこにデータを入れて、適切にフォーマットすることができます。

もう 1 つのオプションは、NULL列を含むテーブルを作成することです。

これを SQL で行うには、次のようにします。

CREATE TABLE tblPerson
(
    PersonId INT,
    FirstName NVARCHAR(256),
    LastName NVARCHAR(256) NULL,
    PRIMARY KEY (PersonId)
)

NULL上記のコラムにも注目してください。

Primary KeysSQL でおよびNULL列を使用してテーブルを作成する方法の詳細については、こちらを参照してください。

SQL でテーブルを作成する

于 2013-03-14T04:44:39.190 に答える
0

を使用できますか

sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN' 

以前に定義されたプレースホルダー列の名前を変更するコマンド。
たとえば、、、#tempTableなどの追加フィールドを使用して を作成します。フィールドを使用する必要がある場合は、目的の名前に名前を変更して、後でコードが暗号化されていない名前で列を参照できるようにします。"VCHAR100_1""BOOL_1""Int_1"

于 2013-08-30T12:34:42.613 に答える
0

完全に動的な列を使用した別のソリューションを次に示します。

DECLARE @sql NVARCHAR(MAX)
,@sqlTableName NVARCHAR(MAX) = ''
,@sqlColumnsDefinitions NVARCHAR(MAX) =''
,@sqlColumnsList NVARCHAR(MAX) =''
,@sqlFrom NVARCHAR(MAX) =''

SET @sqlTableName = 'myTempTable'
SET @sqlFrom = 'FROM dbo.EMPLOYEE AS EMP'

--conditions to define columns
IF (1=1)
    set @sqlColumnsDefinitions='Col1 int, Col2 int, Col3 int'
else
    set @sqlColumnsDefinitions='Col1 int, Col2 int, Col3 int, Col4 int, Col5 int'

--new table with dynamic fields creation
SET @sql = 'if (object_id('''+@sqlTableName+''') is not null) DROP TABLE '+@sqlTableName+'
CREATE TABLE '+@sqlTableName+' ('+@sqlColumnsDefinitions+')'+char(10)
print (@sql)
exec (@sql)

--get columns list
select @sqlColumnsList=STUFF((SELECT ',' + column_name
from INFORMATION_SCHEMA.COLUMNS where table_name like @sqlTableName+'%' FOR XML PATH('')), 1, 1, '')

--main insert
SET @sql = 'INSERT INTO '+@sqlTableName+char(10)+'SELECT '+@sqlColumnsList+char(10)+@sqlFrom
print (@sql)
exec  (@sql)

SQL エンジンが原因で、myTempTable を #myTempTable に置き換えると、これは機能しません。それを修正して正しい列名リストを取得するには、範囲外のいくつかのトリックを使用できます。ただし、非一時テーブルでも機能します。

于 2014-05-16T12:46:14.447 に答える
0

このテーブルがBIGの場合、あなたのロジックでは、このテーブルでJOINSを作成し、TARGET TABLEにインデックスを作成する必要があると思います

TEMPではなく物理テーブルを使用できます

DECLARE @guid NVARCHAR(64), @sql NVARCHAR(MAX)
,@sqlSelect NVARCHAR(MAX) = ''
,@sqlFrom NVARCHAR(MAX) ='', @sqlSchema NVARCHAR(MAX) =''

SET @guid = NEWID()  

declare @tableName NVARCHAR(64)= 'myTempTable'+ @guid

select @tableName

--use some transaction

set @sql = 'CREATE TABLE ' + @tableName  
set @sqlSchema = '(Id INT, DeptId INT, DeptName VARCHAR(100)'  -- DO INDEXES IF YOU ARE JOIN 

SET @sqlSelect ='INSERT INTO ' + @tableName +
'SELECT EMP.Id, EMP.DeptId, EMP.DeptName'


IF (1=1) -- your condition
BEGIN
  SET @sqlSchema = @sqlSchema +', EMP.Salary, EMP.Code'            
END

SET @sqlSchema =   @sqlSchema + ')' -- close last )

set @sql =  @sql +@sqlSchema --create the TargetTable


--DO YOUR logic

EXEC sp_executesql @sql

set @sql = N'DROP TABLE ' + @tableName

EXEC sp_executesql @sql
于 2013-12-10T14:49:34.590 に答える
0

以下の例を参照してください。

declare @sql nvarchar(400)
declare @ColFlag int
set @ColFlag = 1
if(@ColFlag = 0)

set  @sql= 'CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100)); 
    INSERT INTO #myTempTable SELECT 1,2,''DeptName1''; 
    SELECT * FROM #myTempTable'
else
set  @sql= 'CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100), MyNewColHere VARCHAR(25)); 
    INSERT INTO #myTempTable SELECT 1,2,''DeptName1'', ''MyNewColHereValue''; 
    SELECT * FROM #myTempTable'

 exec (@sql)
于 2013-04-20T13:27:49.243 に答える
0

これを試して。

トラン開始


IF (何らかの条件)

    始める
      CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100), Salary money , Code Int)

        Insert Into #myTempTable(Id, DeptId, DeptName, Salary, Code)
        Emp.Id、Emp.DeptID、Emp.DeptName、EMP.Salary、EMP.Codeを選択
        Emp としての dbo.Employee から

        dbo.Employee から ID、DeptID、DeptName、Salary、Code を選択
              テーブル #myTempTable をドロップ     
    終わり

    そうしないと

    始める

      CREATE TABLE #myTempTable2 (Id INT, DeptId INT, DeptName VARCHAR(100))

        #myTempTable(Id, DeptId, DeptName) に挿入
        Emp.ID、Emp.DeptID、Emp.DeptNameを選択
        Emp としての dbo.Employee から

        dbo.Employee から ID、DeptID、DeptName を選択

                    ドロップ テーブル #myTempTable2
    終わり



トランザクションのコミット
于 2014-05-08T19:58:33.577 に答える