【问题标题】:Insert default values if not exist in SQL Server如果 SQL Server 中不存在,则插入默认值
【发布时间】:2020-04-22 07:55:04
【问题描述】:

我有一个关于 SQL Server 的问题:如果表中不存在 9999 个值,如何动态加载所有表的默认值?

数据库有三个表。我想为唯一列加载默认的 9999 值

  • 如果数据类型为varchar,则传递NA 值
  • 如果数据类型为int,则传递0值
  • 如果数据类型是 date 则传递 1900-01-01 值

这里的sourceFiedls表是维护所有表相关的字段信息。

CREATE TABLE [dbo].[dept]
(
    [deptid] [INT] NULL,
    [dname] [VARCHAR](50) NULL,
    [loc] [VARCHAR](50) NULL
)

CREATE TABLE [dbo].[emp]
(
    [eid] [INT] NULL,
    [ename] [VARCHAR](50) NULL,
    [doj] [DATE] NULL,
    [sal] [MONEY] NULL,
    [deptid] [INT] NULL
) 

CREATE TABLE [dbo].[loc]
(
    [locid] [INT] NULL,
    [locname] [VARCHAR](50) NULL
) 

CREATE TABLE [dbo].[sourceFields]
(
    [tablename] [VARCHAR](50) NULL,
    [tablecolumns] [VARCHAR](50) NULL
) 

INSERT INTO [dbo].[dept] ([deptid], [dname], [loc]) 
VALUES (1, N'abc', N'hy')
GO

INSERT INTO [dbo].[emp] ([eid], [ename], [doj], [sal], [deptid]) 
VALUES (1, N'ab', CAST(N'1988-10-04' AS Date), 100.0000, 10)
GO

INSERT INTO [dbo].[loc] ([locid], [locname]) VALUES (1, N'hyd')
GO

INSERT INTO [dbo].[sourceFields] ([tablename], [tablecolumns]) 
VALUES (N'dept', N'deptid'), (N'dept', N'dname'), (N'dept', N'loc'),
       (N'emp', N'eid'), (N'emp', N'ename'), (N'emp', N'doj'),
       (N'emp', N'sal'), (N'emp', N'deptid'), (N'loc', N'locid'), 
       (N'loc', N'locname')
GO

根据上表,我想检查数据是否存在 9999 个值。

对于部门表:

IF NOT EXISTS (SELECT * FROM dept WHERE  deptid=9999 )
BEGIN
    INSERT INTO [dbo].[dept] ([deptid], [dname], [loc]) 
    VALUES (9999, 'NA', 'NA')
END

对于Emp 表:

IF NOT EXISTS (SELECT * FROM emp WHERE  eid=9999 )
BEGIN
    INSERT INTO [dbo].[emp] ([eid], [ename], [doj], [sal], [deptid]) 
    VALUES (9999, 'NA', CAST('1900-01-01' AS Date), 0, 0)
END

对于Loc 表:

IF NOT EXISTS (SELECT * FROM loc WHERE  locid=9999 )
BEGIN
    INSERT INTO [dbo].[loc] ([locid], [locname]) 
    VALUES (9999, 'NA')
END

在这里,我为 3 个表编写了 3 个语句来检查默认值是否存在。 代替这 3 条语句,如何编写动态查询,例如使用游标概念和表循环迭代值 - 如果存在或不存在则插入。 此表维护表名和文件名以生成动态插入语句和值。

CREATE TABLE [dbo].[Tableinfo](
    [TableName] [varchar](50) NULL,
    [ColumnsList] [varchar](1000) NULL
) 

INSERT [dbo].[Tableinfo] ([TableName], [ColumnsList]) VALUES (N'dept',N'deptid,dname,loc')
INSERT [dbo].[Tableinfo] ([TableName], [ColumnsList]) VALUES (N'emp', N'eid,ename,doj,sal,deptid')
INSERT [dbo].[Tableinfo] ([TableName], [ColumnsList]) VALUES (N'loc', N'locid,locname')

您能告诉我如何编写将默认值插入表中的动态查询吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2012


    【解决方案1】:

    这是一个粗略的想法,看看我是如何检索 SID/PK 列的,有一个模式来匹配 PK 或使用 information_schema.tables、table_constraints 等来检索它们:

    DECLARE 
        @delStatement VARCHAR(MAX);
    
    DECLARE def CURSOR
    FOR SELECT 
            'IF NOT EXISTS (SELECT top 1 1 FROM ' + tablename + ' WHERE  ' + tablecolumns + ' = 9999 )
           BEGIN
              INSERT [dbo].[dept] ([deptid], [dname], [loc]) VALUES (9999, ''NA'', ''NA'')
           END'
        From [dbo].[sourceFields]
        where
            tablecolumns = tablename + 'id';
    OPEN def;
    
    FETCH NEXT FROM def INTO 
        @delStatement;
    
    WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @delStatement;
            --Exec(@delStatement) UNCOMMENT THIS
            FETCH NEXT FROM def INTO 
                @delStatement;
        END;
    CLOSE def;
    DEALLOCATE def;
    

    【讨论】:

    • alex;能否请你提供完整的逻辑。它会hepfull
    猜你喜欢
    • 2011-09-01
    • 2020-08-07
    • 2015-11-11
    • 2015-07-06
    • 2018-09-17
    • 2011-07-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多