0

1つのストアドプロシージャがあり、1つの条件でいくつかの問題があります。私もそのように、行のカウントがループ内だけなので、その後> 0ある場合は、1つの以上の条件を追加したいどのように私はからすべてを削除した場合、基本的にはそれが正常に動作し、1つの状態でこれを書くことではなく、ストアドプロシージャの1つで問題が発生しました

どのように行うには、誰もが考えていることができます。

これは私の実際の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 NOT IN (1,2,3,4) 
AND 
name <> 'DB_Audit' AND name <> 'DemoFatalCorruption1' AND name <> 'AdventureWorks' AND name <> 'AdventureWorks2008R2_Old' AND name <> 'AdventureWorks2008R2' 

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 

そして、私はカウントが0より大きい場合だけにして前方に移動そのうちこのライン

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

の下で問題を抱えているが、いくつかは、それがどのようにカウントが0の場合でもループの中に入る

答えて

0

IF文の最後の括弧を削除すると、問題が解決します。

変更し、次のようにIF文のコード:

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

さえ厳しいそれが今私にエラーを与えていないが、それはまだカウントが今0 –

+0

である私たちにあなたがやろうとしているかについて、もう少し情報を提供するための時間であるループ内で起こっていますif文の後のコード。期待される成果は? –

+0

私はAuditのストアプロシージャを作成しています。データベースのいずれかに0のエントリがある場合、ループ内に入るべきではありません。なぜなら、不要な時間が掛かっているからです。だから私がやろうとしていたのは、カウントが0より大きい場合にのみ条件をチェックすることです。ループの中に入ってください。 –

1

次の2つにクエリを分割することができます。テーブルの存在とIFチェックのため

最初IFチェック基礎となる表の任意の行の有無:

IF (OBJECT_ID(+ @DBName + '.dbo.' + @Table_Name) IS NOT NULL) 
    IF EXISTS ('SELECT * FROM ' + @DBName + '.dbo.' + @Table_Name) 

あなたは読みやすくするため、各IFためBEGIN ... ENDを追加することができます混乱を招くことはありません。

+0

これは、 "指定された非ブール型の式です。 –

0

とすることができる、これは少し長いです - しかし、作業溶液:

DECLARE @DBName varchar(50) 
DECLARE @Table_Name varchar(50) 
DECLARE @ConditionIsTrue BIT 
DECLARE @SQL NVARCHAR(MAX) 
SET @DBName = 'tempdb' 
SET @Table_Name = 'MyTestTable' 
SET @ConditionIsTrue = 0 

SET @SQL = ' 
IF (OBJECT_ID(+ @DBName + ''.dbo.'' + @Table_Name) IS NOT NULL) 
    IF EXISTS (SELECT * FROM ' + @DBName + '.dbo.' + @Table_Name + ') 
    SET @ConditionIsTrue = 1 ' 
Execute sp_executesql @SQL, N'@DBName VARCHAR(50), @Table_Name VARCHAR(50), @ConditionIsTrue BIT OUTPUT', @DBName, @Table_Name, @ConditionIsTrue OUTPUT 
SELECT @ConditionIsTrue 
0

あなたは、その後、最初の動的クエリを実行し、その結果を確認する必要があります。 SQLインジェクションを避けるには、QuoteNameを使用する必要があります。

DECLARE @query nvarchar(max) = N'SELECT TOP 1 1 FROM ' + QuoteName(@DBName) + '.dbo.' + QuoteName(@Table_Name) 

EXEC sp_executesql @query 
DECLARE @RowCount int = @@ROWCOUNT 


IF (
    OBJECT_ID(QuoteName(@DBName) + '.dbo.' + QuoteName(@Table_Name)) IS NOT NULL 
    AND @RowCount > 0 
) 
BEGIN 
    -- Do stuff.......... 
END 
関連する問題