【问题标题】:How to select NULL value, as a string, sort of如何选择 NULL 值,作为字符串,排序
【发布时间】:2023-01-11 05:12:17
【问题描述】:

我正在尝试从数据库中的内容生成 SQL 语句,基本上是通过生成 INSERT 语句将数据从一个数据库迁移到另一个数据库。但是我对 NULL 值没有任何运气

示例表 t1:

    c1   c2
r1 'a'   NULL
r2 'b'   'c'
select 'INSERT INTO t2 (c1, c2) VALUES (''' + c1 + ''', ''' + c2 + ''')' from t1

我想要输出:

INSERT INTO t2 (c1, c2) VALUES ('a', NULL)
INSERT INTO t2 (c1, c2) VALUES ('b', 'c')

但第一个只是给我 NULL 作为输出。我已经尝试了各种版本的ISNULL() 和其他类似的版本来获得我想要的,但没有想出有效的解决方案。
现在我正在使用 ISNULL(c2, 'REPLACEWITHNULL') 并在生成语句后进行搜索和替换,但如果可能的话,我想删除第二步。

【问题讨论】:

  • 为什么你想这样做吗?为什么要创建这些语句?这闻起来像 XY Problem
  • + ISNULL('''' + c1 + '''', 'NULL') +
  • 如果要迁移数据使用INSERT ... SELECT语句,请不要通过字符串连接生成INSERTs。它是很多更容易和更快。您还可以从 SSMS 或 Azure Data Studio 等客户端工具编写整个数据库(包括数据)的脚本。字符串连接会导致数字和日期问题,而不仅仅是 NULL。没关系
  • 老实说,有很多工具可以帮助迁移。无论是通过生成脚本、备份和恢复过程,还是自封闭的 ETL 过程。您很少需要像这样自己完全构建一个。更不用说让可怜的目标数据库 INSERT 每一行一次 1 痛苦的行将是可怕为了表现。
  • 这样做的原因是它是数据库(IBM Maximo)中的应用程序配置数据,每个环境中的 id 和对象之间的引用都不同,我需要从开发环境中选择某些数据以导入到其他环境.数据不是很多,每次可能有 10-30 行,但请相信我,这样做很痛苦……我将其作为存储过程来执行,因此我可以查明我想要的数据并执行该过程生成我需要的插入语句。

标签: sql sql-server


【解决方案1】:

有更好的方法来迁移数据库,但您必须有正当理由才能这样做。下面的代码应该可以帮助你。

DECLARE @sourceTable TABLE (c1 VARCHAR(10) NULL, c2 VARCHAR(10) NULL)

INSERT INTO @sourceTable (c1, c2) VALUES ('a', NULL), ('b',   'c'), (NULL, 'd')

--SELECT * FROM  @sourceTable

SELECT 'INSERT INTO t2 (c1, c2) VALUES (' + CASE 
                                                WHEN c1 IS NULL THEN 'NULL' 
                                                ELSE  '''' + c1 + ''''
                                            END + ', ' +
                                            CASE 
                                                    WHEN c2 IS NULL THEN 'NULL' 
                                                    ELSE  ''''+ c2 + ''''
                                            END + ') '
FROM @sourceTable

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2016-03-26
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多