简体   繁体   中英

Issue in dynamic sql for 1 condition

I asked this question yesterday also but I think there was something missing in the question so I am posting it again.

Here is my SP which I created:

 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

Issue:

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

I am trying to figured out how to count the number of rows dynamically wherein if its > 0 only then it should go inside the loop. And in my above code my AND statement is somehow failing or maybe something is wrong.

One will require to find out the count dynamically also the if condition too would be in dynamic query.

I have added another stored procedure to check the Count and Status of the table. You can have this implementation in the original stored procedure itself.

Helping Stored Procedure

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

Implementation in your Stored Procedure.

    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

I have used Temporary Table to store the result of Dynamic Query.

you can also check for null if count is 0 like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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