質問

ビルドプロセスの一環として、4つの異なる環境にコードを展開するときにデータベース更新スクリプトを実行します。さらに、リリースを実稼働環境にドロップするまで同じクエリが追加されるため、特定のデータベースで複数回実行できるようになります 。このように:

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
  CREATE TABLE [Table]
  (...)
END

現在、deployment / buildスクリプトにcreate schemaステートメントがあります。スキーマの存在をどこで照会しますか?

役に立ちましたか?

解決

sys.schemas をお探しですか?

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END

CREATE SCHEMAは独自のバッチで実行する必要があることに注意してください(以下の回答

他のヒント

@bdukesは、スキーマが存在するかどうかを判断するのに適切ですが、上記のステートメントはSQL Server 2005では機能しません。CREATE SCHEMA <name>は、独自のバッチで実行する必要があります。回避策は、execでCREATE SCHEMAステートメントを実行することです。

これは、ビルドスクリプトで使用したものです。

IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
    -- The schema must be run in its own batch!
    EXEC( 'CREATE SCHEMA <name>' );
END

ただ extra <!> quot; defensive <!> quot;であるため、次のバージョンでは<!> gt;の可能性(ただしありそうもない)を説明するために型変換エラーが生成されます。 1一致するSchemaは、検証コードが意図的に例外をスローする方法に似ています。これは、それが良いと信じており、<!> quot; 'best practice' <!> quot;ただし、処理を停止する既知の効果は、トラップされていないエラーの未知のカスケード効果よりも優れているため、致命的な例外を生成するだけの場合でも、考えられるすべての戻り結果を説明します。非常にありそうもないので、よりユーザーフレンドリーな致命的なエラーを生成するために個別のCountチェック+ ThrowまたはTry-Catch-<=>のトラブルの価値があるとは思わなかったそれにもかかわらず。

SS 2005-:

declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end

SS 2008+:

declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end

その後:

if @HasSchemaX = 1
begin
   ...
end -- if @HasSchemaX = 1

これは古いため、追加する必要があります。SQLSERVER 2008+の場合、これらはすべて(選択部分に対して)動作し、EXECUTE('CREATE SCHEMA <name>')を使用して実際に否定的な結果で作成します。

DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'

SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there

IF NOT EXISTS ( SELECT  top 1 *
                FROM    sys.schemas
                WHERE   name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'

SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned

SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned


IF EXISTS (
    SELECT sd.SchemaExists 
    FROM (
        SELECT 
            CASE 
                WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
                WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
                ELSE 0 
            END AS SchemaExists
    ) AS sd
    WHERE sd.SchemaExists = 1
)
BEGIN
    SELECT 'Got it';
END
ELSE
BEGIN
    SELECT 'Schema Missing';
END
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top