Не удалось создать CREATE ASSEMBLY в SQLCLR с использованием строки байта сборки, поскольку не удалось открыть физический файл - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь добавить пользовательских агрегатов в базу данных SQL Server 2008, схема которой определена в моем файле решения Visual Studio 2010.Код для этого пользовательского агрегата находится в проекте SQLCLR в том же решении, но у меня возникают большие трудности с прохождением модульных тестов.Для модульного тестирования этого проекта я использую метод, аналогичный методу здесь , чтобы получить строку байтов сборки.Набор тестов или событие после сборки должно автоматически обновлять мой сценарий для создания сборки каждый раз, потому что после любого вида MSBuild (из командной строки или Visual Studio) биты сборки изменяются.

Сценарий, кажется, обновляет свою строку битов сборки, чтобы правильно соответствовать текущим битам сборки для каждого запуска.Но модульный тест по-прежнему не проходит, с лежащим в основе SQLException сообщением «CREATE ASSEMBLY не удалось, потому что не удалось открыть физический файл« 0xDEADBEEF »: 3 (системе не удается найти указанный путь.)из этого сообщения.) Почему эта ошибка возникает, когда биты сборки кажутся правильными? Как мне это исправить?

Длина фактической строки битов сборки составляет около 16 КБ. Может ли это быть проблемой?? Нужно ли CREATE ASSEMBLY иметь биты для всей сборки или только заголовка, и как мне получить только заголовок?

У нас уже есть инфраструктура модульного тестирования для развертывания этой базы данных, включая запуск pre- и сценарии после развертывания. У нас также есть настроенная авторизация, которую должны иметь наши пользовательские функции и агрегаты.

Вот мой сценарий после развертывания:

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'foo')
   DROP ASSEMBLY foo
go

-- The assembly bits change after every build from the command line or Visual Studio.  
-- This variable needs to change each time the foo assembly changes.
declare @assemblyBits as varchar(max)
-- This string is really about 15000 characters, including some newlines which are removed
-- in the next block.  Word-wrapping this line or not word-wrapping it seems to have no 
-- effect.
set @assemblyBits = '0x42'

-- Trim whitespace from assembly bits.
declare @sanitizedBits as varchar(max)
set @sanitizedBits = Replace(Replace(Replace(@assemblyBits, Char(10), ''), Char(13), ''), Char(9), '')

CREATE ASSEMBLY foo
AUTHORIZATION bar
from @sanitizedBits 
GO

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'Product')
   DROP AGGREGATE Product
go

CREATE AGGREGATE [Aggregations].[Product]
    (@value float,
    @weight float)
    RETURNS float
    EXTERNAL NAME foo.[foo.Product]
go

Ответы [ 2 ]

3 голосов
/ 19 октября 2012

Попробуйте выполнить код «Создать сборку» на удаленном сервере, на котором размещена база данных. Это должно решить проблему.

1 голос
/ 27 февраля 2012

используйте динамический sql, если у вас есть содержимое в виде строки

    EXEC ('CREATE ASSEMBLY foo AUTHORIZATION bar from ' + @sanitizedBits )

Обычно вы передаете в varbinary

...