如何执行存储在临时表单元格中的SQL脚本?

问题描述 投票:0回答:1

我有一个相当复杂的动态 SQL 脚本,它将数十个脚本输出到临时表中。例如:

更新表格 更改列
更新 mydb.sch.tbl SET zipcode = null 其中 col = ''; ALTER TABLE mydb.sch.tbl ALTER COLUMN 邮政编码 INT;
更新 mydb.sch.tbl SET 性别 = null 其中 col = ''; 更改表 mydb.sch.tbl 更改列性别字符;

您可能知道,生成的脚本是用于清理的。它本质上进入指定的表,抓取每一列,并生成脚本来清理它(改变变量类型,修剪列空间,将空白更改为空,并将末尾的列重命名为驼峰式大小写)。

该表(以及我现在所处的位置)包含我需要生成的所有确切脚本。我只需要找到一种方法来执行这些操作。我想我可以使用动态 SQL,但是将它与临时表一起使用是一场噩梦。我也可以将其存储为表,然后在新的动态 SQL 中引用它,但这也有点混乱。还有其他选择吗?或者一般来说最好的选择是什么?

基本上我需要生成这样的东西:

exec(
UPDATE mydb.sch.tbl SET zipcode = null where col = '';
UPDATE mydb.sch.tbl SET gender = null where col = '';       
ALTER TABLE mydb.sch.tbl ALTER COLUMN zipcode INT;
ALTER TABLE mydb.sch.tbl ALTER COLUMN gender CHAR;
)

谢谢!

sql sql-server etl data-cleaning dynamic-sql
1个回答
0
投票

如果您要使用要运行的查询填充

#tempTable
,您可以快速将它们连接成字符串并使用
sp_executesql
执行它们。

drop table if exists #tmpTable;

create table #tmpTable (stmt nvarchar(max));
insert #tmpTable (stmt)
values ('UPDATE mydb.sch.tbl SET zipcode = null where col = '''';')
     , ('UPDATE mydb.sch.tbl SET gender = null where col = '''';')
     , ('ALTER TABLE mydb.sch.tbl ALTER COLUMN zipcode INT;')
     , ('ALTER TABLE mydb.sch.tbl ALTER COLUMN gender CHAR;');

declare @stmt nvarchar(max) = N'';
select @stmt = @stmt + stmt
  from #tmpTable;

exec sp_executesql @stmt = @stmt;

但我很确定,如果您不更改名称,您将不会重新命名该列。也就是说:你不能使用

alter column
将“ThisStyle”更改为“thisStyle”。

© www.soinside.com 2019 - 2024. All rights reserved.