我有一个相当复杂的动态 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;
)
谢谢!
如果您要使用要运行的查询填充
#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”。