web-dev-qa-db-ja.com

SQLクエリからテキストファイルを実行することは可能ですか?

連続して実行したい生成された.sqlファイルがいくつかあります。クエリ(つまり、クエリアナライザー/ Server Management Studio)のSQLステートメントからそれらを実行したいと思います。
このようなことをすることは可能ですか?もしそうなら、これを行うための構文は何ですか?

私は次のようなものを望んでいます:

exec 'c:\temp\file01.sql' 
exec 'c:\temp\file02.sql'

SQL Server 2005を使用し、Management Studioでクエリを実行しています。

37
ChrisHDog

xp_cmdshell および sqlcmd を使用します

EXEC xp_cmdshell  'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FilePathName
46
Gulzar Nazim

非常に参考になりました。次のリンクも参照してください。 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 
16
Archi Moore

または、単にopenrowsetを使用してスクリプトを変数に読み込んで実行します(8年前のトピックを復活させるには申し訳ありません)。

DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
    (   BULK 'MeinPfad\MeinSkript.sql'
    ,   SINGLE_BLOB ) AS MYTABLE

--PRINT @sql
EXEC (@sql)
6
Pesche Helfer

これは私が使用するものです。うまく機能し、再利用が簡単です。ディレクトリ内のすべてのファイルを読み取るように変更できますが、この方法でどのファイルを実行するかを制御できます。

/*  
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  
6
Bruce Thompson

これを行うことはお勧めしませんが、本当に必要な場合は、拡張ストアドプロシージャ 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はコマンドをバックグラウンドで実行します。このため、ユーザー入力を必要とするプログラムの実行には使用しないでください。

5
Mitch Wheat

OSQLをご覧ください。このユーティリティを使用すると、コマンドプロンプトからSQLを実行できます。システムへのインストールは簡単です。無料のSQL Server Expressに付属していると思います。

osqlユーティリティを使用

スタックオーバーフローでの「OSQL」のqick検索は、多くのものが利用可能であることを示しています。

適切に処理する主なものは、コマンドラインで渡されるユーザーとパスワードのアカウントパラメーターです。 NTファイルアクセス許可を使用してパスワードでファイルを制御し、このファイルの内容を使用してスクリプトを開始するバッチファイルを見てきました。また、クイックC#またはVBプログラムを記述して、Processクラスを使用して実行することもできます。

3
John Dyer

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をサーバー名に置き換えます。

2
live-love

Windowsコマンドライン(CMD)を開く

sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
2
Alper Ebicoglu

私がやったようにこの質問に出くわし、これが便利だと思う人にとっては、 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
1
Adam Henderson