簡體   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