繁体   English   中英

动态SQL在1种情况下的问题

[英]Issue in dynamic sql for 1 condition

我昨天也问了这个问题,但我认为这个问题中缺少一些内容,因此我将其再次发布。

这是我创建的SP:

 ALTER PROCEDURE [dbo].[USP_Insert__DDL_Records_Into_FinalTable]
 AS 
 BEGIN

 DECLARE @DBName VARCHAR(50)
 DECLARE @SQLTableDet VARCHAR(MAX)
 DECLARE @SQLInsDet VARCHAR(MAX)
 DECLARE @DelSQLTableDet VARCHAR(MAX)
 DECLARE @Table_Name VARCHAR(20)
 DECLARE @DestDB VARCHAR(20)

 SET @DestDB = 'DB_Audit'
 SET @Table_Name ='t_ddl_log'

 DECLARE Database_Details CURSOR FOR 
 SELECT name   
 FROM 
 sys.databases 
 WHERE
 database_id  =15       
 OPEN Database_Details

 FETCH NEXT FROM Database_Details INTO @DBName

 WHILE @@FETCH_STATUS = 0
 BEGIN

IF (OBJECT_ID(+ @DBName + '.dbo.' + @Table_Name) IS NOT NULL) 

AND ('SELECT CAST (COUNT(*) AS varchar(20)) FROM ' + @DBName + '.dbo.' + @Table_Name) > '0'
BEGIN
    SET @SQLTableDet = ' INSERT INTO '+ @DestDB + '.dbo.'+ @Table_Name + 
                       ' SELECT * FROM ' + @DBName + '.dbo.' + @Table_Name   

    PRINT @SQLTableDet

    SET @SQLInsDet  = 'USE [' + @DBName + ']' + @SQLTableDet
    PRINT @SQLInsDet
    EXEC (@SQLInsDet)

    SET @DelSQLTableDet = 'DELETE FROM ' +  @DBName + '.dbo.' + @Table_Name 
    PRINT @DelSQLTableDet
    EXEC (@DelSQLTableDet)  
END     


 FETCH NEXT FROM Database_Details INTO @DBName
 PRINT @DBName

 END  
CLOSE Database_Details  
DEALLOCATE Database_Details
END

**Output:** <br>

INSERT INTO DB_Audit.dbo.t_ddl_log SELECT * FROM busstarget.dbo.t_ddl_log
USE [busstarget] INSERT INTO DB_Audit.dbo.t_ddl_log SELECT * FROM  busstarget.dbo.t_ddl_log

(0 row(s) affected)
DELETE FROM busstarget.dbo.t_ddl_log

(0 row(s) affected)
Busstarget

问题:

IF (OBJECT_ID(+ @DBName + '.dbo.' + @Table_Name) IS NOT NULL)   
AND ('SELECT CAST (COUNT(*) AS varchar(20)) FROM ' + @DBName + '.dbo.' +  @Table_Name) > '0'

我试图弄清楚如何动态地计算行数,其中如果仅> 0,那么它应该进入循环。 在我上面的代码中,我的AND语句以某种方式失败或出了点问题。

一个条件也将是动态地发现计数,如果条件也将在动态查询中。

我添加了另一个存储过程来检查表的计数和状态。 您可以在原始存储过程本身中实现此实现。

帮助存储过程

Create proc [dbo].[prc_CheckStatus]
@DBName varchar(100),
@TableName  varchar(100)
as
Begin
   Create Table #userData  
   (
       RecordCount int,Remark varchar(100)
   )
   Declare @Qquery varchar(1000)
   SET @Qquery ='insert into #userData
   Select count(*),''RecordCount'' from '+@DBName+'.dbo.'+ @TableName
   -- Print @Qquery 
   Exec(@Qquery )
   SET @Qquery ='
     insert into #userData
     Select count(*),''TableExistance'' from '+@DBName+'.information_schema.columns where TABLE_CATALOG='''+ @DBName+'''
     and TABLE_NAME='''+@TableName+''''

   --Print @Qquery 
   Exec(@Qquery )
   Select * from #userData
END

在您的存储过程中实施。

    ALTER PROCEDURE [dbo].[USP_Insert__DDL_Records_Into_FinalTable]
 AS 
 BEGIN

  Create Table #userData  
   (
       RecordCount int,Remark varchar(100)
   )  
 DECLARE @DBName VARCHAR(50)
 DECLARE @SQLTableDet VARCHAR(MAX)
 DECLARE @SQLInsDet VARCHAR(MAX)
 DECLARE @DelSQLTableDet VARCHAR(MAX)
 DECLARE @Table_Name VARCHAR(200)
 DECLARE @DestDB VARCHAR(20)

 SET @DestDB = 'DB_Audit'
 SET @Table_Name ='t_ddl_log'

 DECLARE Database_Details CURSOR FOR 
 SELECT name   
 FROM 
 sys.databases 
 WHERE
 database_id  =15              
 OPEN Database_Details

 FETCH NEXT FROM Database_Details INTO @DBName

 WHILE @@FETCH_STATUS = 0
 BEGIN

     insert into #userData
     exec prc_CheckStatus @DBName,@Table_Name


       IF (Select count(*) from #userData) > '0'
       BEGIN
           SET @SQLTableDet = ' INSERT INTO '+ @DestDB + '.dbo.'+ @Table_Name + 
                              ' SELECT * FROM ' + @DBName + '.dbo.' + @Table_Name   

           PRINT @SQLTableDet

           SET @SQLInsDet  = 'USE [' + @DBName + ']' + @SQLTableDet
           PRINT @SQLInsDet
           EXEC (@SQLInsDet)

           SET @DelSQLTableDet = 'DELETE FROM ' +  @DBName + '.dbo.' + @Table_Name 
           PRINT @DelSQLTableDet
           EXEC (@DelSQLTableDet)  
       END     

       Truncate table #userData
 FETCH NEXT FROM Database_Details INTO @DBName
 PRINT @DBName

 END  
CLOSE Database_Details  
DEALLOCATE Database_Details
END

我已经使用临时表存储动态查询的结果。

如果count为0,您还可以检查null,如下所示:

IF ((OBJECT_ID(+ @DBName + '.dbo.' + @Table_Name) IS NOT NULL)   
AND ('SELECT nullif(COUNT(*),0) FROM ' + @DBName + '.dbo.' +  @Table_Name) is not null)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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