私があなただったら、SqlCmd.exe (コマンド ライン ユーティリティ) と変数の使用に慣れるでしょう。
以下に5つのファイルのコードを入れてみます。次のように、コード (ファイルの内容) の前にファイルの名前を付けたタグを配置します。
||||||||||||||||||MyFileName.txt||||||||||||||||||
これをファイルの内容に入れることはありませんが、この「マーカー」行の下のすべてがファイルの内容になります。私が持っているのとまったく同じようにファイルに名前を付ける必要があります。そして、すべてのファイルを同じディレクトリに配置します。
すべてのファイルを作成したら、(1 つの) .bat ファイルを編集し、いくつかの情報を更新する必要があります。(主に、sqlcmd.exe がマシンに存在する場所、および統合認証を使用してデータベースを作成する権限がある sqlserver/instance の名前。
一般的な場所は次のとおりです。
%ProgramFiles%\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe
%ProgramFiles%\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe
%ProgramFiles% (x86)\Microsoft SQL Server\90\Tools\Binn\sqlcmd.exe
さあ行こう!
||||||||||||||||||MasterRunMeBatFile.bat|||||||||||||||||||
REM Find the location of your SQLCMD.EXE
set __sqlCmdLocation=c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\SQLCMD.EXE
REM Set your servername/instancename here
set __sqlServerNameAndInstance=MyServerName\MyInstanceName
REM Create the database
"%__sqlCmdLocation%" -i .\DatabaseCreate.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_DatabaseCreateOutput.txt" -v DBName="MyFirstCommandLineDB"
REM Create the multiple Schemas
"%__sqlCmdLocation%" -i .\SchemasCreate.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_SchemasCreate_01.txt" -v DBName="MyFirstCommandLineDB" SchemaName="Schema01"
"%__sqlCmdLocation%" -i .\SchemasCreate.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_SchemasCreate_02.txt" -v DBName="MyFirstCommandLineDB" SchemaName="Schema02"
"%__sqlCmdLocation%" -i .\SchemasCreate.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_SchemasCreate_03.txt" -v DBName="MyFirstCommandLineDB" SchemaName="Schema03"
REM Create the DDL (tables)
"%__sqlCmdLocation%" -i .\OrganizationDDL.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_OrganizationDDL_01.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema01" MyUniqueNumber="01" DBUSERNAME="public"
"%__sqlCmdLocation%" -i .\OrganizationDDL.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_OrganizationDDL_02.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema02" MyUniqueNumber="02" DBUSERNAME="public"
"%__sqlCmdLocation%" -i .\OrganizationDDL.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_OrganizationDDL_03.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema03" MyUniqueNumber="03" DBUSERNAME="public"
REM Create some stored procedures against the multiple schemas
"%__sqlCmdLocation%" -i .\TSQL_USP_UDF_TRG.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_TSQL_USP_UDF_TRG_01.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema01" MyUniqueNumber="01" DBUSERNAME="public"
"%__sqlCmdLocation%" -i .\TSQL_USP_UDF_TRG.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_TSQL_USP_UDF_TRG_02.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema02" MyUniqueNumber="02" DBUSERNAME="public"
"%__sqlCmdLocation%" -i .\TSQL_USP_UDF_TRG.sql -b -S "%__sqlServerNameAndInstance%" -E -o ".\ZZZ_TSQL_USP_UDF_TRG_03.txt" -v DBName="MyFirstCommandLineDB" MySchemaVariable="Schema03" MyUniqueNumber="03" DBUSERNAME="public"
set __sqlCmdLocation=
set __sqlServerNameAndInstance=
||||||||||||||||||DatabaseCreate.sql||||||||||||||||||
Use [master];
GO
if exists (select * from sysdatabases where name='$(DBName)')
BEGIN
DROP DATABASE [$(DBName)];
END
GO
Create Database $(DBName)
GO
||||||||||||||||||SchemasCreate.sql|||||||||||||||||||
Use [$(DBName)]
GO
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '$(SchemaName)')
BEGIN
-- The schema must be run in its own batch!
EXEC( 'CREATE SCHEMA $(SchemaName)' );
END
IF EXISTS (SELECT 1 FROM sys.schemas WHERE name = '$(SchemaName)')
BEGIN
PRINT 'SCHEMA $(SchemaName) Exists!' ;
END
ELSE
BEGIN
PRINT 'Oh My : SCHEMA $(SchemaName) does not exist.' ;
END
GO
||||||||||||||||||OrganizationDDL.sql|||||||||||||||||||
Use [$(DBName)]
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[$(MySchemaVariable)].[Employee$(MyUniqueNumber)]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [$(MySchemaVariable)].[Employee$(MyUniqueNumber)]
END
GO
CREATE TABLE [$(MySchemaVariable)].[Employee$(MyUniqueNumber)]
(
EmployeeUUID [UNIQUEIDENTIFIER] NOT NULL DEFAULT NEWSEQUENTIALID() ,
SSN varchar(11) ,
LastName varchar(24) ,
FirstName varchar(24) ,
DateOfBirth smalldatetime
)
ALTER TABLE [$(MySchemaVariable)].[Employee$(MyUniqueNumber)] ADD CONSTRAINT PK_Employee$(MyUniqueNumber)
PRIMARY KEY NONCLUSTERED (EmployeeUUID)
ALTER TABLE [$(MySchemaVariable)].[Employee$(MyUniqueNumber)] ADD CONSTRAINT CK_Employee$(MyUniqueNumber)_SSN_Unique
UNIQUE (SSN)
GRANT SELECT , INSERT, UPDATE, DELETE ON [$(MySchemaVariable)].[Employee$(MyUniqueNumber)] TO $(DBUSERNAME)
GO
PRINT 'Select * from [$(MySchemaVariable)].[Employee$(MyUniqueNumber)]'
Select * from [$(MySchemaVariable)].[Employee$(MyUniqueNumber)]
||||||||||||||||||TSQL_USP_UDF_TRG.sql|||||||||||||||||||
Use [$(DBName)]
GO
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[$(MySchemaVariable)].[uspEmployeeGetAll]') AND type in (N'P', N'PC'))
DROP PROCEDURE [$(MySchemaVariable)].[uspEmployeeGetAll]
GO
CREATE PROCEDURE [$(MySchemaVariable)].[uspEmployeeGetAll]
AS
SET NOCOUNT ON
SELECT
EmployeeUUID ,
SSN ,
LastName ,
FirstName ,
DateOfBirth
FROM
[$(MySchemaVariable)].[Employee$(MyUniqueNumber)] e
SET NOCOUNT OFF
GO
GRANT EXECUTE ON $(MySchemaVariable).[uspEmployeeGetAll] TO $(DBUSERNAME)
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[$(MySchemaVariable)].[uspEmployeeGetAll]') AND type in (N'P', N'PC'))
PRINT '[$(MySchemaVariable)].[uspEmployeeGetAll] has been created!'
GO
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[$(MySchemaVariable)].[uspEmployeeGetByUUID]') AND type in (N'P', N'PC'))
DROP PROCEDURE [$(MySchemaVariable)].[uspEmployeeGetByUUID]
GO
/*
declare @EmployeeUUID uniqueidentifier
select @EmployeeUUID = NEWID()
exec [$(MySchemaVariable)].[uspEmployeeGetByUUID] @EmployeeUUID
*/
CREATE PROCEDURE [$(MySchemaVariable)].[uspEmployeeGetByUUID]
@EmployeeUUID uniqueidentifier
AS
SET NOCOUNT ON
SELECT
EmployeeUUID ,
SSN ,
LastName ,
FirstName ,
DateOfBirth
FROM
[$(MySchemaVariable)].[Employee$(MyUniqueNumber)] e
WHERE
e.EmployeeUUID = @EmployeeUUID
SET NOCOUNT OFF
GO
GRANT EXECUTE ON $(MySchemaVariable).[uspEmployeeGetByUUID] TO $(DBUSERNAME)
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[$(MySchemaVariable)].[uspEmployeeGetByUUID]') AND type in (N'P', N'PC'))
PRINT '[$(MySchemaVariable)].[uspEmployeeGetByUUID] has been created!'
GO
=============== 終了ファイルとファイル内容======================
Ok。
この演習の最後には....このようなものが得られるはずです。
3 つのテーブル: (同じデータベース内)
[Schema01].[Employee01] ,
[Schema02].[Employee02] ,
[Schema03].[Employee03]
そして、以下のようなストアド プロシージャ。(ストアド プロシージャのスキーマ名と、それが取得するテーブルに注意してください。)
ALTER PROCEDURE [Schema01].[uspEmployeeGetAll]
AS
SET NOCOUNT ON
SELECT
EmployeeUUID ,
SSN ,
LastName ,
FirstName ,
DateOfBirth
FROM
[Schema01].[Employee01] e
私見では。変数を指定して sqlcmd.exe を使用することは、さまざまな環境間で完全な再現性を確保するための最良の方法です。
別の人の考え:
http://blogs.msdn.com/tomholl/archive/2008/04/29/thoughts-on-being-a-solution-architect.aspx
開発者が作成する必要があるコードの量を最小限に抑える 開発者はコードを作成することで報酬を受けており、一般的にそれが得意です。しかし、開発者が要件やストーリーの断片を割り当てられると、それらの特定の要件に取り組む必要があり、他の全員が行っていることを詳細に把握することは容易ではありません。
これには、マクロ レベルのコードの再利用とリファクタリングのさまざまな要件または機会の間の相乗効果を発見することが含まれます。アーキテクトの仕事の大部分は、これらの機会が発生したときにそれを拾い上げ、開発者が自分の世界で車輪を再発明しないようにすることです。
理想的には、これにより、独自の部分に集中することで、開発者がより少ないコードで要件を達成できるパターン、コンポーネント、およびフレームワークが得られるはずです。
追加:
http://www.yaldex.com/sql_server_tutorial_3/ch06lev1sec5.html
それがスクリプトを開発する方法です。ただし、(.sql ファイル内の) 変数設定をコメント アウトすることを忘れないでください。ファイルの内容内の変数は、コマンド ライン経由で送信された変数よりも優先されるためです。
この問題に投票してください!
http://connect.microsoft.com/sqlserver/feedback/details/382007/in-sqlcmd