Masz plik na dysku ze zdjęciem lub certyfikatem lub czymkolwiek innym. Plik jest binarny. Jak go wstawić do zmiennej lub do tabeli?
1 2 3 4 5 6 7 8 9 10 |
USE tempdb GO CREATE TABLE MyBinary(Blob VARBINARY(MAX)) GO DECLARE @Data VARBINARY(MAX) SET @Data = (SELECT BulkColumn FROM Openrowset( Bulk 'C:\temp\MyCertificate.cer', Single_Blob) as img) INSERT MyBinary VALUES(@Data) GO |
W moim przypadku chciałem korzystać z tak zaimportowanego certyfikatu w skrypcie, żeby uruchamiając skrypt na danym systemie nie trzeba było kopiować żadnych dodatkowych plików na czas instalacji. Innymi słowy chciałem mieć zmienną binarną zadeklarowaną w skrypcie. Moja „sztuczka” polegała na wyeksportowaniu danych tabeli MyBinatry i odpowiedniej modyfikacji skryptu. W tym celu:
- Kliknij prawą myszką na bazie danych i wybierze Tasks >> Generate Scripts
- W kreatorze zaznacz tylko tabelę MyBinary
- W następnym oknie kreatora kliknij Advanced i zmień „Schema only” na „Data only”
- W wygenerowanym skrypcie znajdzie się dłuuuuga wartość, która jest reprezentacją kolumny binarnej
1 2 3 4 |
Teraz udało mi się więc napisać fragment skryptu w postaci (część binarna jest dla skrócenia wycięta): DECLARE @DataCert VARBINARY(MAX) SET @DataCert = (0x308...129) |
No dobrze. A jak teraz tego rodzaju zmienną zapisać w postaci pliku binaranego z powrotem na dysku? Skorzystamy z funkcji OLE, które zazwyczaj ze względu na wymogi bezpieczeństwa są wyłaczone, dlatego skrypt najpierw sprawdzi czy opcja ‚Ole Automation Procedures’ jest wyłączona, zapamięta to, włączy jeśli trzeba, a na końcu przywróci oryginalne ustawienia. Środkowa część skryptu to kilka kolejnych kroków, które należy wykonać aby dane zapisać na dysku:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
DECLARE @DataCert VARBINARY(MAX) SET @DataCert = (0x308...129) DECLARE @certPath varchar(50) = 'C:\temp\MyCertificate.cer' DECLARE @handle int EXEC sp_OACreate 'ADODB.Stream', @handle OUTPUT; EXEC sp_OASetProperty @handle, 'Type', 1; EXEC sp_OAMethod @handle, 'Open'; EXEC sp_OAMethod @handle, 'Write', NULL, @DataCert; EXEC sp_OAMethod @handle, 'SaveToFile', NULL, @certPath, 2; EXEC sp_OAMethod @handle, 'Close'; EXEC sp_OADestroy @handle; IF @initialOLEAutomationOption = 0 BEGIN EXEC sp_configure 'Ole Automation Procedures', 0 RECONFIGURE WITH OVERRIDE END |