1

SSDT/VS2012/TFS では、ストアド プロシージャは CREATE スクリプトとして保存されます。

select * from [$(MyOtherDatabase)].[dbo].[someTable] のようないくつかのスクリプトで使用するデータベース参照もあります。

プロジェクトでストアド プロシージャを開いて実行すると、CREATE スクリプトが実行され、エラーが発生します。また、$(MyOtherDatabase) などの変数は解決されません。

これらの問題に対処する最善の方法は何ですか?

スクリプトを手動で ALTER に変更しますか? すべての変数を手動で値に置き換えますか? その後、手順を TFS にチェックインするときに、これらすべての操作を元に戻す必要がありますか? それとも、すべてを公開する必要がありますか?

4

2 に答える 2

2

Q:スクリプトを手動で ALTER に変更しますか?

いいえ、プロジェクトをコンパイルして公開すると、適切な DDL が自動的に決定されます。

Q:すべての変数を手動で値に置き換えますか?

いいえ。ローカル、テスト、ステージなど、使用している各構成内の変数値を変更または設定できます。

Q:すべてを公開する必要がありますか?

公開すると、スクリプトが作成されるか、構成ファイルに基づいて変更がデータベースに直接適用されます。ターゲット データベースが設定された構成を選択すると、発行によってスクリプトが作成されるか、変更が直接適用されます。したがって、対象とする環境によって異なります。

VSDT またはデータベース プロジェクトを使用している場合、展開は、プロジェクトを直接または作成したスクリプトを介してコンパイルおよび発行することによって処理されるように設計されています。

create ステートメントを alter ステートメントに変更すると、コア機能が失われ、データベース プロジェクトが誤って使用されます。プロジェクトをコンパイルすると、スクリプトで DDL ステートメントの作成または変更を使用する必要があるかどうかが決定され、展開の対象となるデータベースに基づいてこの決定が自動的に行われます。

データベース プロジェクトの設定

方法: ターゲット プラットフォームを変更し、データベース プロジェクトを発行する

于 2013-04-12T14:13:08.680 に答える
0

私が UDF で使用するこのトリックを試すことができます。

それらを削除して再度追加するのに問題がありました(ほとんどの場合、ストアドプロシージャで行うことです)。そこで、以下の冪等な解決策を思いつきました。

Use [$(DBName)]
GO

:Error $(ErrorOutputFileFromCommandLine)  

/*
Create a stubbed version if it does not exist... if it exists, this could shouldn't run, thus not violating permissions
*/

if NOT exists (select *  from sysobjects 
    where id = object_id('dbo.udfMySuperCoolUDF') and sysstat & 0xf = 0)
    BEGIN
        print 'Creating the stubbed version of dbo.udfMySuperCoolUDF'
        EXEC ( 'CREATE FUNCTION dbo.udfMySuperCoolUDF (@i as smallint , @j as smallint ) RETURNS bit AS BEGIN RETURN 0 END')
    END
GO


ALTER FUNCTION dbo.udfMySuperCoolUDF (@ValidationLookupCategoryKey smallint , @ValidationLookupKey smallint  )
    RETURNS bit AS
    BEGIN
        declare @exists int

        select @exists = 0

        /* Logic Here */

        return @exists
    END

2番。

「sqlcmd」モードを調査します。$(MyVariable) を「そのまま」保持し、sqlcmd モード (SSMS 内) および配置 (sqlcmd.exe) でそれらを操作する方法を学びます。

于 2013-04-12T13:39:52.090 に答える