7

我需要在临时表中插入一些数据。

我有一些基于条件的列,例如Salary,Code

如何为基于条件的列创建表?我不想用 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

How many dynamic columns do you need?

What about having a column called Dynamic of type nvarchar(MAX) or something of the like, and then you can just put your data in there and format as appropriate.

Another option is to create a table with NULL columns.

To do this in SQL, you can do the following:

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

Notice the NULL column above also.

See here for further explanation on creating tables with Primary Keys and NULL columns in SQL:

Create tables in SQL

于 2013-03-14T04:44:39.190 回答
1

正如所提到的,您最好的选择是可能创建您需要的所有列,并在可选的情况下使它们为 NULLable。所以:

CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100), Salary INT NULL, EmpCode VARCHAR(45) NULL);

IF (someCondition)
BEGIN
    SET @sqlSelect = @sqlSelect +', EMP.Salary, EMP.Code'            
END
ELSE
BEGIN
    SET @sqlSelect = @sqlSelect +', NULL, NULL'            
END
于 2013-10-11T23:47:07.690 回答
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

使用代码并告诉我它是否有效?

-----------------------------------------------------

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

,@sqlFrom NVARCHAR(MAX) =''

IF (someCondition)
BEGIN
    CREATE TABLE #tblInfo (Id INT, DeptId INT, DeptName VARCHAR(100))    
END
ELSE
BEGIN
    CREATE TABLE #tblInfo (Id INT, DeptId INT, DeptName VARCHAR(100),Salary numeric(18,2), Code INT)    
END

SET @sqlSelect ='INSERT INTO #tblInfo 
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

------------------------------------

我希望它会工作

于 2013-10-16T22:44:51.500 回答
0

我认为你真正想要的对于 SQL 来说是不可能的。我不明白您想为例如满足条件的元组添加列。所以我认为你需要一些其他的数据库引擎,比如 NoSQL(我对 NoSQL 不是很熟悉,但据我所知它可以水平扩展)

如果你不想从 sql 切换,我认为你应该重新考虑你的设计。
如果你坚持你的设计,你可以做一些事情,例如添加一个列,名称“列名”和另一列“列数据”,并在需要时填充它。但是正如你所看到的,它有自己的约束,比如“列数据”的数据应该是相同的类型。

于 2013-09-08T13:34:53.463 回答
0

您可以在满足条件时更改临时表(我假设您知道此时所需的列?)

IF (someCondition)
BEGIN
    ALTER TABLE #myTempTable ADD Salary VARCHAR(20), Code VARCHAR(20)
    SET @sqlSelect = @sqlSelect +', EMP.Salary, EMP.Code'            
END

您可能需要先测试该列是否存在,如果您有多个可以激活的条件 - 您可以这样做:

IF COL_LENGTH('#myTemptable','Salary') IS NULL
BEGIN
     -- do something if salary doesn't exist
     ALTER TABLE #myTempTable ADD Salary NUMERIC(6,2)
END

正如其他人所指出的,您可以预先将列创建为可为空的 - 或在满足条件后创建表。

于 2013-06-19T12:48:54.217 回答
0

下面的代码可能对你有用。

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

,@sqlFrom NVARCHAR(MAX) =''

IF (someCondition)
BEGIN
    CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100))    
END
ELSE
BEGIN
    CREATE TABLE #myTempTable (Id INT, DeptId INT, DeptName VARCHAR(100),Salary numeric(18,2), Code INT)    
END

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
于 2013-05-27T11:57:16.490 回答
0

If this table is BIG I think your and in your logic you make JOINS with this table you need to create indexes in TARGET TABLE

You can go around with Physical table not 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

你能用

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

命令更改先前定义的占位符列的名称。
例如,使用额外的字段创建, #tempTable,等。如果您需要使用该字段,请将其重命名为所需的名称,以便您的代码稍后可以通过非隐蔽名称引用该列。"VCHAR100_1""BOOL_1""Int_1"

于 2013-08-30T12:34:42.613 回答
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)

        插入#myTempTable(Id,DeptId,DeptName,Salary,代码)
        选择 Emp.Id、Emp.DeptID、Emp.DeptName、EMP.Salary、EMP.Code
        来自 dbo.Employee 作为 Emp

        从 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
        来自 dbo.Employee 作为 Emp

        从 dbo.Employee 中选择 Id、DeptID、DeptName

                    删除表 #myTempTable2
    结尾



提交事务
于 2014-05-08T19:58:33.577 回答