繁体   English   中英

使用 cursor 执行 sql 查询并将其值存储在表中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM