【发布时间】: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