База данных SQL Azure - правильный подход к получению содержимого файла в процедуре хранилища - PullRequest
0 голосов
/ 20 сентября 2018

** Сценарий: **

  • Хранимая процедура SQL принимает в качестве входных данных fileName.
  • Прочитайте содержимое файла и вставьте его в таблицу.

Для локального сервера SQL вышеприведенный сценарий был достигнут с помощью следующей хранимой процедуры.

-- @_filePath would be input to the store procedure
DECLARE @_filePath NVARCHAR(MAX) =  'C:\SQLContent\test1.sql'

CREATE TABLE tmpTable (tmpIndex INT NOT NULL IDENTITY PRIMARY KEY CLUSTERED, sqlContent NVARCHAR(MAX) NOT NULL)

-- Read content of the file @_filePath
DECLARE @_insertQuery NVARCHAR(MAX) = 'insert tmpTable (sqlContent) select * from OPENROWSET(bulk ''' + @_filePath + ''', SINGLE_CLOB) as a'
EXEC sp_ExecuteSql @_insertQuery


Select * from tmpTable

Проблема:

Фактическая проблемас сервером SQL Azure, путь, указанный в вышеупомянутой хранимой процедуре, не будет доступен для сервера SQL.

C: \ SQLContent \ test1.sql

Сообщение об ошибке в SQL Azure:

Невозможно выполнить массовую загрузку, поскольку файл "C: \ SQLContent \ test1.sql" не может быть открыт.Код ошибки операционной системы (ноль).

Возможные решения:

  1. Загрузить файл test1.sql в BLOB-объект Azure и прочитать хранимую процедуру в файлесодержимое из большого двоичного объекта выглядит следующим образом:
select *
from OPENROWSET
 (BULK 'temp1.sql', DATA_SOURCE = 'MyAzureStorage', SINGLE_CLOB) as data

Ссылка - [ ошибка при выполнении OPENROWSET (BULK) / База данных SQL Azure

Вместо передачи @_filePath в качестве аргумента хранимой процедуры, передайте содержимое файла в качестве аргумента хранимой процедуре.

Ask

Outиз двух возможных решений проблемы, какое из них является лучшим и почему?

Кроме того, предложите, если есть какой-либо другой лучший подход.

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете использовать OPENROWSET или BULK INSERT.Я не знаю никаких преимуществ или недостатков, которые могут сделать одно лучше другого.Однако, если учетная запись хранения является общедоступной, вам необходимо как минимум создать внешний источник данных:

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
 WITH ( TYPE = BLOB_STORAGE, LOCATION = 'https://myazureblobstorage.blob.core.windows.net');

BULK INSERT Product
FROM 'data/product.dat'
WITH ( DATA_SOURCE = 'MyAzureBlobStorageAccount');

Если учетная запись хранения не является общедоступной, необходимо дополнительно создать учетные данные в области базы данных.

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
 WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
 SECRET = 'sv=2015-12-11&ss=b&srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z&spr=https&sig=copyFromAzurePortal';

​CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
 WITH ( TYPE = BLOB_STORAGE,
        LOCATION = 'https://myazureblobstorage.blob.core.windows.net',
        CREDENTIAL= MyAzureBlobStorageCredential);

BULK INSERT Product
FROM 'data/product.dat'
WITH ( DATA_SOURCE = 'MyAzureBlobStorageAccount');

Надеюсь, это поможет.

...