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