sql - SQL Server 游标动态 SQL 'SOURCE.dbo.SRC_KLIENT' 附近的语法不正确
问题描述
declare kursor cursor for
select
exec_No, insert_type, stg_table, src
from
METADATA.dbo.METADATA
order by
exec_No asc;
declare @insert_type varchar(15), @stg_table varchar(30),
@src varchar(80), @SQL varchar(254), @exec_No numeric(2),
@SQL_INSERT varchar(254);
open kursor
fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;
while @@FETCH_STATUS = 0
begin
if @insert_type = 'select'
begin
-- select @SQL = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table;
select @SQL = 'DROP TABLE IF EXISTS '+@stg_table;
select @SQL_INSERT = 'select * from '''+@src+''' as '+@stg_table;
exec(@SQL);
execute(@SQL_INSERT);
fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;
end
if @insert_type = 'bulk'
begin
execute ('truncate table ' + @stg_table);
execute('BULK INSERT '+@stg_table+'
FROM ''' + @src + '''
WITH
(
FIELDTERMINATOR = '',''
)')
end
fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;
end
close kursor;
deallocate kursor;
我得到错误
消息 102,级别 15,状态 1,第 1 行
“SOURCE.dbo.SRC_KLIENT”附近的语法不正确。消息 102,级别 15,状态 1,第 1 行
“SOURCE.dbo.SRC_MIEJSCOWOSC”附近的语法不正确。消息 102,级别 15,状态 1,第 1 行
“SOURCE.dbo.SRC_PRACOWNIK”附近的语法不正确。消息 102,级别 15,状态 1,第 1 行
“SOURCE.dbo.SRC_MELDUNEK”附近的语法不正确。
错误由语句生成:
select @SQL_INSERT = 'select * from '''+@src+''' as '+@stg_table;
我的元数据插入:
insert into
METADATA.dbo.METADATA(exec_No,src,stg_table,temp_table, chd_table, insert_type)
values(1,'SOURCE.dbo.SRC_KLIENT', 'STAGE.dbo.STG_KLIENT', 'TEMP.dbo.TEMP_KLIENT', 'CHD.dbo.KLIENT', 'select');
insert into
METADATA.dbo.METADATA(exec_No,src,stg_table,temp_table, chd_table, insert_type)
values(15,'SOURCE.dbo.SRC_MELDUNEK', 'STAGE.dbo.STG_MELDUNEK', 'TEMP.dbo.TEMP_MELDUNEK', 'CHD.dbo.MELDUNEK', 'select');
任何想法如何让它工作?
多谢你们 !
解决方案
我终于做到了。有一个工作(我现在知道它不安全)代码:
declare
kursor cursor for select exec_No, insert_type, stg_table, src from METADATA.dbo.METADATA order by exec_No ASC;
declare @insert_type varchar(15), @stg_table varchar(30), @src varchar(80), @SQL varchar(254), @exec_No numeric(2), @SQL_INSERT varchar(254);
open kursor
fetch next from kursor
into @exec_No, @insert_type, @stg_table, @src;
WHILE @@FETCH_STATUS = 0
begin
if @insert_type = 'select'
begin
select @SQL = 'DROP TABLE IF EXISTS '+@stg_table;
select @SQL_INSERT = 'select * into ' + @stg_table + ' from ' + @src;
print(@SQL);
print(@SQL_INSERT);
exec(@SQL);
exec(@SQL_INSERT);
end
if @insert_type = 'bulks'
begin
execute ('truncate table ' + @stg_table);
execute('BULK INSERT '+@stg_table+'
FROM ''' + @src + '''
WITH
(
FIELDTERMINATOR = '',''
)')
end
fetch next from kursor
into @exec_No, @insert_type, @stg_table, @src;
end
CLOSE kursor;
deallocate kursor;
在 SQL Serverselect * from table_1 as table_2
中查询不正确。正确的一个是select * into table_2 from table_1
。
还有重复的“ fetch next ...
”块(一个在第一个if,另一个在ifs外面)。
谢谢你们的帮助!
推荐阅读
- python - Pandas Dataframe:拆分包含字典列表的列
- c# - 为什么在 Ctrl+C 上我的进程突然停止在“任务
.Result”,但适用于“等待任务” “? - ios - 允许 Swift 函数参数为多种类型
- reactjs - 当使用 Material UI 切换深色模式时,Formio 表单的字体颜色更改为白色
- apache-spark - 如何在 Azure Synapse WorkSpace 中找到并安装 Great_Expectations .JAR 文件
- reactjs - TinyMCE React 光标在键入一个键后重新开始
- c++ - 处理完所有排队事件后调用代码
- python - 如何遍历嵌套字典(来自 json)并检查键是否在另一个嵌套字典中(来自 json),如果不是则添加?
- amazon-web-services - 如何通过 NAT 网关而不是公共 IP 传输数据包?
- openssl - 在 OpenSSL 中测试自生成的 RSA 公钥