[英]Execute a sql query using cursor and store its value in table
无法在表中插入记录。 我正在使用 sql 服务器尝试在执行查询后在表中插入记录。 我想将视图中的行数与表中的视图名称一起存储。 尝试将查询结果与视图名称一起存储在表中时出现错误。
DECLARE @Sql NVARCHAR(MAX);
DECLARE @view_name NVARCHAR(MAX);
Drop TABLE IF EXISTS AllTableUnion
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'dbo.AllRecords') AND type in (N'U'))
BEGIN
CREATE table dbo.AllRecords
(
query varchar(MAX),
view_name varchar(MAX)
)
END
SELECT 'select count(*) from ' + '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' as query,
'[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' as view_name
into AllTableUnion
FROM sys.all_objects AS t
where t.schema_id=1 and t.TYPE like 'V'
group by t.schema_id, t.name
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT query,view_name
FROM AllTableUnion --<-- table where sql is stored
OPEN Cur
FETCH NEXT FROM Cur INTO @Sql, @view_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
insert into dbo.AllRecords(
query,view_name
)
values (Exec sp_executesql @Sql, print @view_name
FETCH NEXT FROM Cur INTO @Sql , @view_name
END
CLOSE Cur
DEALLOCATE Cur;
例如,您需要在 @sql 构建中包含插入
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.Alltableunion'))
begin
drop table alltableunion
end
go
--create table alltableunion(query varchar(max),view_name varchar(max))
--go
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.AllRecords'))
begin
drop table allrecords
end
go
DECLARE @Sql NVARCHAR(MAX);
DECLARE @view_name NVARCHAR(MAX);
--Drop TABLE IF EXISTS AllTableUnion
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.AllRecords') AND type in (N'U'))
BEGIN
CREATE table dbo.AllRecords
(
query varchar(MAX),
view_name varchar(MAX)
)
END
SELECT 'insert into allrecords(query,view_name)
select count(*),'+char(39)+'[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' + char(39) +
' from ' + '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' as query,
'[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' as view_name
into AllTableUnion
FROM sys.all_objects AS t
where t.schema_id=1 and t.TYPE like 'V'
group by t.schema_id, t.name
DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR
SELECT query,view_name FROM AllTableUnion --<-- table where sql is stored
OPEN Cur
FETCH NEXT FROM Cur INTO @Sql, @view_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
print @sql
exec sp_executesql @sql
FETCH NEXT FROM Cur INTO @Sql , @view_name
END
CLOSE Cur
DEALLOCATE Cur;
select * from allrecords
query view_name
----------- ---------
5 [dbo].[vu]
(1 row(s) affected)
为什么要将计数设置为 varchar(max)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.