SQL Server游标动态SQL“SOURCE.dbo.SRC_KLIENT”附近的语法不正确
我会犯错误 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_KLIENT”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_miejscowsc”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_PRACOWNIK”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_meldanek”附近的语法不正确 错误由以下语句生成:SQL Server游标动态SQL“SOURCE.dbo.SRC_KLIENT”附近的语法不正确,sql,sql-server,sql-server-2017,database-cursor,Sql,Sql Server,Sql Server 2017,Database Cursor,我会犯错误 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_KLIENT”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_miejscowsc”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_PRACOWNIK”附近的语法不正确 Msg 102,15级,状态1,第1行 “SOURCE.dbo.SRC_meldanek”附近的语法不正确 错误由以下语句生成: declare kursor c
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;
我的元数据插入:
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');
在SQL Server中,从表_1中选择*,因为表_2不是正确的查询。正确的方法是从表1中选择*进入表2中
此外,还有重复的“下一个获取…”块,第一个if内有一个,另一个ifs外有一个
谢谢你们的帮助 打印或选择动态SQL语句变量的值。如果你不能解决这个问题,那么就粘贴那些打印语句的输出从'+@src+'中选择*作为'+@stg_表;虽然对象名称没有用单引号引起来,但它是不正确的。QUOTENAME是您的朋友,但您对下面解释的数据有问题。啊,您正在表中存储完整的对象名。这是个问题;不要。将数据中的部分拆分为数据库、模式和对象名称;然后你可以分别引用每个部分。否则你会让自己处于注射状态;这是一个大问题。另外,顺便提一下。格式化代码是一件非常有用的事情。您在该查询中没有缩进,因此很难理解。您有多个IF、WHILE语句,不可能知道哪个结束属于哪个开始。在编写SQL时养成使用缩进和换行的习惯。请注意,左边的不规则代码是编写SQL的一个好方法。它不会运行,但这里有一个包含一些格式化代码和一些注释的示例。谢谢。有可能使我的代码工作吗?这是一个小项目——我没有太多时间来更改元数据表结构。我会记住,最好将数据分割成更小的部分。你能试着更正我的代码吗?
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;