Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Menyimpan File dalam Database SQL Menggunakan FILESTREAM – Bagian 2

Dalam artikel saya sebelumnya, saya menjelaskan cara mengkonfigurasi FILESTREAM di SQL Server, membuat database dan tabel yang mendukung FILESTREAM. Selain itu, saya mendemonstrasikan cara menyisipkan dan menghapus data dari tabel FILESTREAM.

Pada artikel ini, saya akan mendemonstrasikan cara menyisipkan banyak file dalam tabel FILESTREAM menggunakan T-SQL.

Dalam demo ini, kita akan menggunakan modul PowerShell untuk mengisi daftar file dan menyimpannya di tabel SQL.

Pemeriksaan Prasyarat dan Pertanyaan Berguna untuk Mendapatkan Konfigurasi FILESTREAM

Untuk demo ini, saya menggunakan:

  1. Versi SQL:SQL Server 2017
  2. Basis data:FileStream_Demo basis data
  3. Alat:PowerShell, SQL Server Management Studio, Alat Data SQL Server.

Pada artikel saya sebelumnya, saya telah membuat database bernama FileStream_Demo . Fitur FILESTREAM diaktifkan Pada contoh SQL Server, dan database memiliki izin tingkat akses T-SQL dan Win32.

Untuk meninjau pengaturan tingkat akses FILESTREAM, jalankan kueri berikut:

Gunakan FileStream_DemoGoSELECT Host_Name() sebagai 'Server Name' ,NAME sebagai 'Database Configuration', CASE WHEN value =0 THEN 'FILESTREAM is Disabled' WHEN value =1 THEN 'Enabled for T-SQL' WHEN value =2 THEN ' Diaktifkan untuk T-SQL dan Win32' END AS 'FILESTREAM Option'FROM sys.configurationsWHERE NAME ='filestream access level'Go

Output dari query adalah sebagai berikut:

Untuk meninjau File Database dan lokasi wadah data FILESTREAM, jalankan kueri berikut:

Gunakan FileStream_DemoGoSELECT Host_Name() sebagai 'Server Name',NAME Sebagai 'Filegroup Name', type_desc sebagai 'Filegroup Type', physical_name sebagai 'Database File Location' DARI sys.database_files

Output dari query adalah sebagai berikut:

Menyisipkan Beberapa File menggunakan Skrip SQL

Untuk menyisipkan banyak file dalam tabel SQL:

  1. Buat dua tabel SQL bernama, Document_List dan Document_Content . Document_Content tabel memiliki FileStreamCol kolom dengan tipe data VARBINARY(MAX) dan atribut kolom FILESTREAM. Konten file dalam direktori akan dikonversi dalam VARBINARY(MAX) dan disimpan di FileStreamCol kolom Document_Content meja.
  2. Buat kueri SQL dinamis yang berulang melalui Document_Location tabel untuk mendapatkan jalur file dan menyisipkan file di Document_Content tabel.
  3. Bungkus seluruh kode T-SQL dalam prosedur tersimpan.

Membuat Tabel SQL

Pertama, buat tabel sementara global untuk menyimpan detail file. Untuk ini, jalankan kueri berikut di FileStream_Demo basis data.

GUNAKAN [FileStream_Demo]GOBuat tabel Document_List( ID int identity(1,1) Primary Key berkerumun, nama lengkap Varchar(max), nama Varchar(max), atribut Varchar(250), CreationTime datetime, LastAccessTime datetime, LastWriteTime datetime, Numerik panjang (10,2))

Selain itu, buat tabel untuk menyimpan File di dalam tabel. Jalankan kueri berikut untuk membuat tabel fisik:

GUNAKAN [FileStream_Demo]GOCREATE TABLE [dbo].[Document_Content ]( [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [RootDirectory] [varchar](max) NULL, [FileName] [varchar](max) NULL, [ FileAttribute] [varchar](150) NULL, [FileCreateDate] [datetime] NULL, [FileSize] [numeric](10, 5) NULL, [FileStreamCol] [varbinary](maks) FILESTREAM NULL,UNIQUE NONCLUSTERED ([ID] ASC )DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON]DOummypre-Documents] [GOummy
 Untuk meningkatkan kinerja kueri pemilihan, tambahkan indeks berkerumun di FileName dan Jenis File kolom Document_Content meja. Untuk ini, jalankan kode berikut:

GUNAKAN [FileStream_Demo]GOCREATE CLUSTERED INDEX [ICX_Document_Content_FileName] ON [dbo].[Document_Content]( [FileName] ASC, [FileType] ASC)DENGAN (PAD_INDEX =MATI, STATISTICS_NORECOMPUTE =OFF, SORT_IN_TEMPDB_IN_TE ONLINE =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY] FILESTREAM_ON [Dummy-Documents]GO

Buat Modul PowerShell untuk Mengisi Detail File

Setelah tabel dibuat, jalankan skrip PowerShell untuk menyisipkan detail file di Document_List meja. Skrip PowerShell berjalan dalam prosedur tersimpan T-SQL, oleh karena itu untuk menulis seluruh kode dalam prosedur SQL, Anda perlu membuat fungsi PowerShell. Jalur direktori adalah parameter input wajib dari fungsi. Script mendapatkan daftar file, berada di parameter direktori yang digunakan untuk menjalankan fungsi PowerShell.

Kodenya adalah sebagai berikut:

  1. Buat fungsi dan nyatakan parameter input wajib. Kodenya adalah sebagai berikut:
    function global:getFileList{param( [Parameter(Position=0,mandatory=$true)] [string[]] $FilePath)
  2. Membuat string yang memiliki kueri “Sisipkan”. Lihat kode berikut:
    [email protected]'INSERT INTO ##Document_List( nama lengkap, nama, atribut, CreationTime, LastAccessTime, LastWriteTime, Length) VALUES ( '{0}', '{1}', '{ 2}', '{3}', '{4}', '{5}', '{6}')'@
  3. Dapatkan daftar file menggunakan perintah Get-ChildItem -Recurse memformat output dari perintah. Kodenya adalah sebagai berikut:
    Get-ChildItem -Recurse $Directorypath | pilih @{Label="FullName";Expression={split-path($_.FullName)}}, nama, atribut, CreationTime, LastAccessTime, LastWriteTime,@{Label="Length";Expression={$_.Length / 1MB -sebagai [int] }}
  4. Menggunakan loop For-Each, simpan output di Document_content meja. Untuk menjalankan kueri di FileStream_Demo database, skrip menggunakan Invoke-Sqlcmd . Kodenya adalah sebagai berikut:
    ForEach-Object { $SQL =$sqltmplt -f $_.FullName, $_.name, $_.attributes, $_.CreationTime, $_.LastAccessTime, $_.LastWriteTime, $_.Length Invoke-sqlcmd -Query $SQL -ServerInstance TTI412-VM\SQL2017 -database FileStream_Demo }

Seluruh kode fungsi PowerShell akan terlihat seperti berikut ini:

fungsi global:getFileList{param( [Parameter(Position=0,mandatory=$true)] [string[]] $FilePath)Write-Output "Inserting files"[email protected]'INSERT INTO dbo.Document_List( nama lengkap, nama, atribut, CreationTime, LastAccessTime, LastWriteTime, Length ) VALUES ( '{0}', '{1}', '{2}', '{3}', '{4}', '{5} ', '{6}')'@Invoke-Sqlcmd -Kueri "Truncate Table Document_List" -ServerInstance TTI412-VM\SQL2017 -database FileStream_DemoGet-ChildItem -Recurse $FilePath | pilih @{Label="FullName";Expression={split-path($_.FullName)}},name,attributes, CreationTime, LastAccessTime, LastWriteTime,@{Label="Length";Expression={$_.Length / 1MB -sebagai [int] }}| ForEach-Object {$SQL =$sqltmplt -f $_.Nama Lengkap, $_.name,$_.attributes, $_.CreationTime, $_.LastAccessTime, $_.LastWriteTime,$_.Length Invoke-sqlcmd -Query $SQL -ServerInstance TTI412-VM\SQL2017 -database FileStream_Demo}Write-Output "File berhasil dimasukkan... Di bawah ini adalah daftar file."}

Untuk menggunakan fungsi PowerShell dalam prosedur SQL Stored, kita perlu mendaftarkan skrip di atas sebagai Modul PowerShell. Untuk ini, buat direktori bernama getFileList di C:\Windows\System32\WindowsPowerShell\v1.0\Modules . Untuk mendaftarkan skrip PowerShell apa pun sebagai modul, skrip dan nama direktori harus sama. Karenanya simpan skrip di atas sebagaigetFileList.psm1 di getFileList direktori.

Sekarang, ketika kita mengeksekusi skrip PowerShell dari T-SQL, kita perlu mengimpor getFileList modul. Untuk ini, tambahkan kode berikut di profil PowerShell. Profil PowerShell akan dibuat di C:\Windows\System32\WindowsPowerShell\v1.0 lokasi.

impor-modul getFileList

Jika profil tidak ada, jalankan perintah berikut untuk membuat profil.

Item Baru -Jenis File -Path $PROFILE.AllUsersAllHosts -Force

Buat Prosedur Tersimpan untuk Mengimpor File

Setelah kami menyimpan daftar file dan informasi di Tabel SQL, kami akan memasukkan file ke dalam Document_Content tabel.

Untuk melakukan tugas ini secara efektif, buat prosedur tersimpan berparameter bernama sp_Insert_Documents . Ini akan menggunakan FileLocation parameter yang bertipe data varchar. Prosedur mengisi daftar file dari lokasi yang diberikan dalam parameter dan menyisipkan semua file di Document_Content tabel.

Langkah 1:Ubah parameter konfigurasi.

Untuk menjalankan perintah PowerShell menggunakan T-SQL, aktifkan xp_cmdshell opsi konfigurasi. Ini adalah opsi konfigurasi lanjutan; maka sebelum mengaktifkan xp_cmdshell , aktifkan Tampilkan opsi lanjutan opsi konfigurasi. Untuk ini, jalankan perintah T-SQL berikut secara berurutan.

gunakan mastergoexec sp_configure 'tampilkan opsi lanjutan',1konfigurasi ulang dengan overrideExec sp_configure 'xp_cmdshell',1Konfigurasi ulang dengan override

Langkah 2:Gunakan skrip PowerShell untuk mengisi daftar file dalam kode T-SQL

Untuk menjalankan skrip PowerShell menggunakan T-SQL, gunakan xp_cmdshell prosedur. Ini menjalankan perintah PowerShell, yang mengisi daftar file dan detailnya di Document_List tabel.
Kodenya adalah sebagai berikut:

deklarasikan @PSScript varchar(2500)set @PSScript='powershell.exe getFileList ''' + @FileLoc +'''' exec xp_cmdshell @PSScript

Langkah 3:Buat kueri SQL dinamis untuk mendapatkan lokasi file

Buat kueri SQL dinamis yang diulang melalui Document_List tabel, memuat konten file, terletak di jalur yang diberikan di Nama Lengkap kolom, ubah menjadi kolom VARMINAR(MAX) dan sisipkan ke dalam Document_Content meja. Bersama dengan File, skrip menyisipkan Nama File, atribut File, Ukuran File, dan Jenis File ke dalam Document_Content meja. Skrip menggunakan huruf besar ekspresi untuk menentukan jenis file.

Kodenya adalah sebagai berikut:

SET @FileCount =(SELECT Count(*) FROM Document_List) WHILE ( @i <@FileCount ) MULAI SET @FileName =(PILIH TOP 1 nama FROM Document_List) /* Gabungkan kolom DirectoryLocation dan FileName untuk menghasilkan FQDN. */ SET @FileName =(PILIH TOP 1 Nama FROM Document_List) SET @FileLocation =(PILIH TOP 1 nama lengkap FROM Document_List di mana name=@FileName) SET @FileAttribute =(PILIH TOP 1 atribut DARI Document_List di mana name=@FileName) SET @ FileCreateDate =(PILIH TOP 1 CreationTime FROM Document_List di mana name=@FileName) SET @FileSize =(PILIH TOP 1 Panjang FROM Document_List di mana name=@FileName) SET @FileType =(PILIH TOP 1 CASE WHEN ( nama LIKE '%jpg%' ) ATAU ( nama SEPERTI '%png%' ) ATAU ( nama SEPERTI '%jpg%' ) ATAU ( nama SEPERTI '%bmp%' ) KEMUDIAN 'Gambar' KETIKA ( nama SEPERTI '%txt%' )KEMUDIAN 'File Teks' When ( nama LIKE '%xls%' )THEN 'Text Files' When ( nama LIKE '%doc%' ) THEN 'Text Files' ELSE 'Other Files' END AS 'File Type' FROM Document_List dimana name=@FileName) SET @SQLText ='Insert into Document_Content (ID, RootDirectory, FileName, FileAttribute,FileCreateDate,FileSize,FileType,FileStreamCol) Pilih NEWID(), ''' + @FileLocation + ''', ''' + @FileName + ''', ''' + @FileAttribute + ''', ''' + @FileCreateDate + ''', ''' + @FileSize + ''', ' '' + @FileType + ''', bulkColumn dari Openrowset(Bulk '''+ @FileLocation + ''', Single_Blob) sebagai tb' EXEC Sp_executesql @SQLText DELETE FROM Document_List WHERE name =@FileName SET @I =@I + 1END

Langkah 4:Bungkus seluruh kode SQL dalam prosedur tersimpan

Buat prosedur tersimpan berparameter bernama sp_Insert_Files dan bungkus kode di dalamnya.

Kode Stored Procedure adalah sebagai berikut:

gunakan Prosedur FileStream_DemogoCreate sp_Insert_Files@FileLoc varchar(maks)sebagai permulaan MENYATAKAN @FileCount INTDECLARE @I INT =0DECLARE @FileName NVARCHAR(maks) MENYATAKAN @SQLText NVARCHAR(maks)menyatakan @PSScript varchar(2500)DECLARE @(Location Filemax )deklarasikan @FileAttribute varchar(50)deklarasikan @FileCreateDate varchar(50)deklarasikan @FileSize varchar(10)deklarasikan @FileType varchar(20)set @PSScript='powershell.exe getFileList ''' + @FileLoc +'''' exec xp_cmdshell @PSScriptSET @FileCount =(SELECT Count(*) FROM Document_List) WHILE ( @i <@FileCount ) MULAI /* Dapatkan Nama File dari tabel Document_Name */ SET @FileName =(PILIH nama TOP 1 DARI Document_List) /* Isi Detail file dari tabel Document_List*/ SET @FileName =(PILIH TOP 1 Nama DARI Document_List) SET @FileLocation =(PILIH TOP 1 nama lengkap FROM Document_List di mana name=@FileName) SET @FileAt upeti =(PILIH TOP 1 atribut FROM Document_List di mana name=@FileName) SET @FileCreateDate =(PILIH TOP 1 CreationTime FROM Document_List di mana name=@FileName) SET @FileSize =(PILIH TOP 1 Panjang FROM Document_List di mana name=@FileName) / *Tentukan jenis file*/ SET @FileType =(PILIH TOP 1 CASE WHEN ( nama LIKE '%jpg%' ) OR ( nama LIKE '%png%' ) OR ( nama LIKE '%jpg%' ) ATAU ( nama LIKE '%bmp%' ) THEN 'Images' WHEN ( nama LIKE '%txt%' )THEN 'Text Files' When ( nama LIKE '%xls%' )THEN 'Text Files' When ( nama LIKE '%doc%' ) LALU 'File Teks' LAINNYA 'File Lain' AKHIR SEBAGAI 'Jenis File' DARI Document_List di mana name=@FileName) SET @SQLText ='Insert into Document_Content (ID, RootDirectory, FileName, FileAtt ribute,FileCreateDate,FileSize,FileType,FileStreamCol) Pilih NEWID(), ''' + @FileLocation + ''', ''' + @FileName + ''', ''' + @FileAttribute + ''', '' ' + @FileCreateDate + ''', ''' + @FileSize + ''', ''' + @FileType + ''', bulkColumn dari Openrowset(Bulk '''+ @FileLocation + ''', Single_Blob) sebagai tb' EXEC Sp_executesql @SQLText DELETE FROM Document_List WHERE name =@FileName SET @I =@I + 1ENDEnd

Menyisipkan File menggunakan Prosedur Tersimpan

Sekarang uji prosedur tersimpan. Saya menambahkan beberapa file ke E:\Files direktori. Masukkan file ke dalam tabel SQL dengan menjalankan prosedur tersimpan. Kodenya adalah sebagai berikut:

gunakan FileStream_Demogoexec sp_Insert_Files 'E:\Files'

Mari kita verifikasi bahwa file telah disalin ke tabel. Untuk ini, jalankan kode berikut:

pilih RootDirectory sebagai 'File Location', FileName sebagai 'File Name', FileAttribute sebagai 'Attribute', FileCreateDate sebagai 'Attribute', FileSize sebagai 'File Size', FileType sebagai 'File Type', FileStreamCol sebagai 'File Content' dari Document_Content di mana FileType='Images'

Output dari query adalah sebagai berikut:

Untuk mengakses file pada penyimpanan data FILESTREAM menggunakan Win32 API, gunakan Pathname () metode FILESTREAM. Dengan Pathname () metode, kami dapat mengidentifikasi jalur logis untuk mendeteksi file di penyimpanan data FILESTREAM secara unik.

Kodenya adalah sebagai berikut:

pilih RootDirectory sebagai 'File Location', FileName sebagai 'File Name', FileAttribute sebagai 'Attribute', FileCreateDate sebagai 'Attribute', FileSize sebagai 'File Size', FileType sebagai 'File Type', FileStreamCol.PathName() AS FilePathfrom Document_Content di mana FileName='RowDesign.png'

Output dari query adalah sebagai berikut:

Mari navigasikan ke wadah data FILESTREAM (E:\Dummy-Documents) untuk memverifikasi bahwa file telah dimasukkan. Lihat tangkapan layar berikut:

Seperti yang Anda lihat, semua file telah dimasukkan ke dalam tabel SQL dan wadah FileStream.

Ringkasan

Dalam artikel ini, saya telah membahas:

  1. Kueri yang berguna untuk memverifikasi prasyarat fitur FILESTREAM.
  2. Cara mendaftarkan fungsi PowerShell sebagai modul.
  3. Jelaskan kode PowerShell untuk menyisipkan daftar file di tabel SQL menggunakan skrip PowerShell.
  4. Menjelaskan kode stored procedure untuk menyisipkan banyak File ke dalam Tabel SQL.
  5. Kueri yang berguna untuk mengumpulkan daftar dokumen, disimpan dalam wadah FILESTREAM.

Di artikel mendatang, saya akan menjelaskan cara mencadangkan dan memulihkan basis data yang mendukung FILESTREAM.

Tetap disini!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Azure:Database XXXYYY di server saat ini tidak tersedia

  2. SCD Tipe 1

  3. SQL Kunci Asing:Semua yang Perlu Anda Ketahui Tentang Operasi Kunci Asing

  4. Menghubungkan PowerShell ke Salesforce.com

  5. Hire or Get Hire:Model Data untuk Proses Rekrutmen