动态生成的insert和select语句

时间:2014-05-26 14:04:45

标签: tsql sql-server-2012 dynamic-sql information-schema

我有一个包含一些表的数据库,我希望动态生成 insert select 语句,而无需在select子句中使用case语句每张桌子。

select语句非常简单,挑战在于插入一,因为我必须处理每一列及其数据类型。我设法通过案例陈述来克服它,但我认为对于包含大量列的表和具有许多表的数据库来说,它很难工作。

我希望能够为每个表和列更改硬编码的表和列名称,我需要动态生成的SQL命令。

我在以下select语句中为我所拥有的数据库(testDB)的给定表进行了编写:

use testDB;

go

set dateformat dmy;

select
    'select * from ' + s.name + '.' + t.name + ';' as cmd_select,
    'insert into ' + s.name + '.' + t.name + ' (' +
    stuff(( select ', ' + column_name
            from information_schema.columns
            where table_name = t.name and ordinal_position > 1
            order by ordinal_position
            for xml path(''), type).value('.', 'nvarchar(max)'),
        1, 2, '')
        + ') values (' + 
    case t.name
        when 'Person' then '''xxx'''
        when 'WeightHistory' then '0.0, ''' + convert(varchar, current_timestamp, 103) + ''', ''' + left(convert(varchar, current_timestamp, 108), 5) + ''', 1'
        when 'WorkTime' then '''' + convert(varchar, current_timestamp, 103) + ''', ''' + left(convert(varchar, current_timestamp, 108), 5) + ''', 1, null'
        when 'TimeReference' then '''07:00'', ''' + convert(varchar, current_timestamp, 103) + ''', null'
    end
     + ');'as cmd_insert --,
    --t.lob_data_space_id
    --, s.name, t.name, *
from sys.tables as t
inner join sys.schemas as s on t.schema_id = s.schema_id
where t.lob_data_space_id = 0; /* tables that don't have LOB columns (sysdiagrams, varchar(max), xml, etc.) */

我想知道的是: 是否有更好的方法来制作动态生成的insert语句而不对数据库的每个表和列使用case语句?

ADITIONAL INFO

上述代码的表定义如下:

if not exists (select * from sys.tables where lower(name) = N'person' )
    begin
        create table Person.Person (
            PersonID int
                            constraint PK_Person
                            primary key
                            identity (1, 1),
            Name varchar(100)
        );
    end;
go
if not exists (select * from sys.tables where lower(name) = N'weighthistory' )
    begin
        create table dbo.WeightHistory (
            WeightHistoryID int
                            constraint PK_WeightHistory
                            primary key
                            identity (1, 1),
            MeasureValue money,
            MeasureDate date,
            MeasureTime time(0),
            PersonID int,

            constraint FK_Weight_Person foreign key (PersonID) references Person.Person (PersonID)
        );
    end;
go
if not exists (select * from sys.tables where lower(name) = N'worktime')
    begin
        create table WorkTime (
            WorkTimeID  int
                        constraint PK_WorkTime primary key
                        identity(1, 1),
            WorkDate date,
            WorkTime time(0),
            PersonID int,
            TimeReferenceID int,

            constraint FK_WorkTime_Person foreign key (PersonID) references Person.Person (PersonID) on delete cascade,
            constraint FK_WorkTime_Reference foreign key (TimeReferenceID) references Work.Timereference (TimeReferenceID)
        );
    end;
go
if not exists (select * from sys.tables where lower(name) = N'timereference')
    begin
        create table Work.TimeReference (
            TimeReferenceID int
                constraint PK_TimeReferene primary key
                identity (1, 1),
            WorkTime time(0),
            WorkTimeStartDate date,
            WorkTimeEndDate date
        );
    end;

0 个答案:

没有答案