連続して実行したい生成された.sqlファイルがいくつかあります。クエリ(つまり、クエリアナライザー/ Server Management Studio)のSQLステートメントからそれらを実行したいと思います。
このようなことをすることは可能ですか?もしそうなら、これを行うための構文は何ですか?
私は次のようなものを望んでいます:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
SQL Server 2005を使用し、Management Studioでクエリを実行しています。
xp_cmdshell および sqlcmd を使用します
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
非常に参考になりました。次のリンクも参照してください。 SQL Serverスクリプトの実行 同様の例。 xp_cmdshell
オンとオフは以下を参照してください。
オン
SET NOCOUNT ON
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
Off
EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE
EXEC master.dbo.sp_configure 'show advanced options', 0
RECONFIGURE
SET NOCOUNT OFF
または、単にopenrowsetを使用してスクリプトを変数に読み込んで実行します(8年前のトピックを復活させるには申し訳ありません)。
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)
これは私が使用するものです。うまく機能し、再利用が簡単です。ディレクトリ内のすべてのファイルを読み取るように変更できますが、この方法でどのファイルを実行するかを制御できます。
/*
execute a list of .sql files against the server and DB specified
*/
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
DECLARE @DBServerName VARCHAR(100) = 'servername'
DECLARE @DBName VARCHAR(100) = 'db name'
DECLARE @FilePath VARCHAR(200) = 'path to scrips\'
/*
create a holder for all filenames to be executed
*/
DECLARE @FileList TABLE (Files NVARCHAR(MAX))
INSERT INTO @FileList VALUES ('script 1.sql')
INSERT INTO @FileList VALUES ('script 2.sql')
INSERT INTO @FileList VALUES ('script X.sql')
WHILE (SELECT COUNT(Files) FROM @FileList) > 0
BEGIN
/*
execute each file one at a time
*/
DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) Files FROM @FileList)
DECLARE @command VARCHAR(500) = 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i "' + @FilePath + @Filename +'"'
EXEC xp_cmdshell @command
PRINT 'EXECUTED: ' + @FileName
DELETE FROM @FileList WHERE Files = @FileName
END
COMMIT TRAN
これを行うことはお勧めしませんが、本当に必要な場合は、拡張ストアドプロシージャ xp_cmdshell
はあなたが望むものです。最初にファイルの内容を変数に読み込んでから、次のようなものを使用する必要があります。
DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd
注:xp_cmdshellはコマンドをバックグラウンドで実行します。このため、ユーザー入力を必要とするプログラムの実行には使用しないでください。
OSQLをご覧ください。このユーティリティを使用すると、コマンドプロンプトからSQLを実行できます。システムへのインストールは簡単です。無料のSQL Server Expressに付属していると思います。
スタックオーバーフローでの「OSQL」のqick検索は、多くのものが利用可能であることを示しています。
適切に処理する主なものは、コマンドラインで渡されるユーザーとパスワードのアカウントパラメーターです。 NTファイルアクセス許可を使用してパスワードでファイルを制御し、このファイルの内容を使用してスクリプトを開始するバッチファイルを見てきました。また、クイックC#またはVBプログラムを記述して、Processクラスを使用して実行することもできます。
Windows認証の場合、別のユーザーとして実行している場合:Windowsユーザーとしてコマンドプロンプトを開きます(右クリック、ファイルの場所を開く、Shift +右クリック、別のユーザーとして実行)
sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql"
または、SQL Serverユーザーを使用している場合:
sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql" -U UserName -P Password
ローカルサーバーでない場合は、localhost\SQLEXPRESSをサーバー名に置き換えます。
Windowsコマンドライン(CMD)を開く
sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
私がやったようにこの質問に出くわし、これが便利だと思う人にとっては、 Bruce Thompsonの答え (ループ内のファイルからSQLを実行した)が好きでしたが、 Pesche Helferのファイルへのアプローチ実行 (xp_cmdshellの使用を避けたため)。
そこで、この2つを組み合わせました(手動で作成したリストの代わりにフォルダーからすべてを実行するように少し調整しました)。
DECLARE @Dir NVARCHAR(512) = 'd:\SQLScriptsDirectory'
DECLARE @FileList TABLE (
subdirectory NVARCHAR(512),
depth int,
[file] bit
)
INSERT @FileList
EXEC Master.dbo.xp_DirTree @Dir,1,1
WHILE (SELECT COUNT(*) FROM @FileList) > 0
BEGIN
DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) subdirectory FROM @FileList)
DECLARE @FullPath NVARCHAR(MAX) = @Dir + '\' + @FileName
DECLARE @SQL NVARCHAR(MAX)
DECLARE @SQL_TO_EXEC NVARCHAR(MAX)
SELECT @SQL_TO_EXEC = 'select @SQL = BulkColumn
FROM OPENROWSET
( BULK ''' + @FullPath + '''
, SINGLE_BLOB ) AS MYTABLE'
DECLARE @parmsdeclare NVARCHAR(4000) = '@SQL varchar(max) OUTPUT'
EXEC sp_executesql @stmt = @SQL_TO_EXEC
, @params = @parmsdeclare
, @SQL = @SQL OUTPUT
EXEC (@sql)
DELETE FROM @FileList WHERE subdirectory = @FileName
PRINT 'EXECUTED: ' + @FileName
END