简体   繁体   English

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

[英]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: 这是我创建的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

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. 我试图弄清楚如何动态地计算行数,其中如果仅> 0,那么它应该进入循环。 And in my above code my AND statement is somehow failing or maybe something is wrong. 在我上面的代码中,我的AND语句以某种方式失败或出了点问题。

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: 如果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