2017-05-15 19 views

答えて

1

明らかに、SQLアカウントはこれらのファイル/フォルダへのアクセス権を必要とします。

DECLARE @FileContents VARCHAR(MAX) 

SELECT @FileContents=BulkColumn 
FROM OPENROWSET(BULK'PathToYourFile.sql', SINGLE_BLOB) x; 
EXECUTE(@FileContents) 

それはより多くの '動的' にするには:

DECLARE @path nvarchar(MAX) 
DECLARE @FileContents varchar(MAX) 


SET @path = N'C:\Users\username\Desktop\example.txt' 
SET @path = REPLACE(@path, N'''', N'''''') 

DECLARE @sql nvarchar(MAX) 
SET @sql = N'SELECT @FileContents=BulkColumn FROM OPENROWSET(BULK''' + @path + ''', SINGLE_BLOB) x;' 

EXEC sp_executesql @sql, N'@FileContents varchar(MAX) OUTPUT', @[email protected] OUTPUT; 
EXECUTE(@FileContents); 

更新 あなたはこのようなディレクトリ内のファイルを一覧表示することができます。

DECLARE @BasePath varchar(8000) 
SET @BasePath = 'D:\temp'; -- List contents of this directory 


--Create a temp table to hold the results. 
IF OBJECT_ID('tempdb..#DirectoryTree')IS NOT NULL 
    DROP TABLE #DirectoryTree; 

CREATE TABLE #DirectoryTree 
(
    id int IDENTITY(1,1) 
    ,fullpath varchar(2000) 
    ,subdirectory nvarchar(512) 
    ,depth int 
    ,isfile bit 
); 


INSERT #DirectoryTree (subdirectory, depth, isfile) 
EXEC master.sys.xp_dirtree @BasePath, 1, 1; 
-- SELECT subdirectory, * FROM #DirectoryTree 



-- Start Cursor 

DECLARE @fileName varchar(MAX) -- filename for backup 
DECLARE fileList CURSOR FOR (SELECT subdirectory FROM #DirectoryTree WHERE isfile = 1) 

OPEN fileList 
FETCH NEXT FROM fileList INTO @fileName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @fileName = @BasePath + '\' + @fileName 
    PRINT @fileName 
    PRINT 'You can do something with the file here...' 

    -- SET @fileContents = 'blabla' get the file contents 
    --EXECUTE('fileContents') 


    FETCH NEXT FROM fileList INTO @fileName 
END 

CLOSE fileList 
DEALLOCATE fileList 

-- End Cursor 


IF OBJECT_ID('tempdb..#DirectoryTree')IS NOT NULL 
    DROP TABLE #DirectoryTree; 
+0

を私は 'はできないバルクロードというエラーを取得します。ファイル "C:\ Users \ ssss \ Desktop \ abc.txt"は存在しません。** PathToYourFile.sql **は、スクリプトまたは特定のファイルへのパスを保存したフォルダを意味しますか? ** example.txt **は、スクリプトへのパスを含むテキストファイルを意味しますか?申し訳ありませんが、私は少し混乱しています。 – Curiousity

+1

example.txtはSQLコードを含むファイルになります。もちろん、パスのリストを含むファイルを作成することもできます。このエラーが発生した場合は、パスが間違っているか、サーバーがローカルコンピュータで実行されていないか、sql-userがこのファイルにアクセスできません。 –

+0

ありがとう..それは働いた..私はこれを使用して一度に複数のSQLスクリプトを実行したい場合は、別のファイルまたはそのような何かからパスを読み取る必要がありますか?あるいは、一度に複数のスクリプトを実行する他の方法はありますか?同様に、フォルダのパスを指定して、その場所にあるすべてのスクリプトを実行しますか? – Curiousity

1

あなたが取得するsqlcmdを使用することができますファイル名を指定し、インスタンスに対してスクリプトを実行します。

DECLARE @path VARCHAR(128) = 'C:\SQLScripts\ ' 
     ,@cmd VARCHAR(1024) 

CREATE TABLE dirList (
    line varchar(1000) 
) 

SET @cmd = 'dir /b ' + @path + '*.sql' 

INSERT INTO dirList (line) 
EXEC xp_cmdshell @cmd 

DECLARE @actualFile VARCHAR(256) 

DECLARE cur CURSOR FAST_FORWARD READ_ONLY FOR 
SELECT * FROM dirList WHERE line IS NOT NULL; 

OPEN cur 
FETCH NEXT FROM cur INTO @actualFile 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @cmd = 'sqlcmd -S <ComputerName>\<InstanceName> -i ' + @path + @actualFile 
EXEC xp_cmdshell @cmd 

FETCH NEXT FROM cur INTO @actualFile 

END 

CLOSE cur 
DEALLOCATE cur 

DROP TABLE dirList 

注:あなたはこのような何か行うことができます

+0

xp_dirtreeはxp_cmdshellよりも良いオプションです。しかし、はい、それは動作します。 –

+0

ありがとうございます。しかし、私は** sqlcmdを使用せずにこれをしようとしています** ... – Curiousity

関連する問題