Masz plik na dysku ze zdjęciem lub certyfikatem lub czymkolwiek innym. Plik jest binarny. Jak go wstawić do zmiennej lub do tabeli?
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
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:
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