Próbuję skopiować zestaw wysyłania wiadomości e-mail z jednej bazy danych do drugiej. Kliknąłem na asembler skryptu jako tworzenie i utworzyłem go w nowej bazie danych.

Kiedy próbuję wysłać e-mail z funkcją w nowszej bazie danych pojawia się następujący błąd:

Parametr „nazwa_pliku” nie może być pustym ciągiem. Nazwa parametru: nazwa_pliku

Jak mogę skopiować zestaw między bazami danych?

Trochę szczegółów:

  • Obie bazy danych znajdują się w tej samej instancji
  • Obie bazy danych są własnością tego samego loginu
  • Korzystanie z programu SQL Server 2016
  • Zespół jest oznaczony jako UNSAFE w obu DB
  • Oba bazy danych mają włączone TRUSTWORTHY
  • Obiekt opakowujący T-SQL jest funkcją skalarną / UDF
  • Funkcja jest wywoływana w ten sam sposób w obu DB
1
user829982 13 styczeń 2020, 22:23

1 odpowiedź

Najlepsza odpowiedź

Jak mogę skopiować zestaw między bazami danych?

Jak dotąd nie rozumiem, jak to jest problem SQLCLR. Wyraźnie skopiowałeś Assembly i obiekt opakowania T-SQL, w przeciwnym razie zamiast błędu .NET pojawią się błędy T-SQL.

Kliknąłem na asembler skryptu jako tworzenie i utworzyłem go w nowej bazie danych.

Biorąc pod uwagę, że utworzyłeś skrypt obiektu opakowania T-SQL i otrzymujesz błąd związany z parametrem wejściowym, możesz napotkać błąd, który powoduje, że domyślne parametry NVARCHAR nie są skryptami wydostać się poprawnie:

Skrypty SSMS Procedura składowana CLR NVARCHAR parametr NULL domyślnie jako N '' (pusty ciąg)

Wykonaj następujące czynności zarówno w starych, jak i nowych bazach danych, aby upewnić się, że wszystkie definicje parametrów są takie same, w tym wszelkie potencjalne wartości domyślne (zwracając szczególną uwagę na wiersze, które mają 1 dla [has_default_value]):

SELECT [name], [user_type_id], [max_length], [is_output],
       [has_default_value], [default_value]
FROM   sys.parameters prm
WHERE  prm.[object_id] = OBJECT_ID(N'dbo.ObjectName')
ORDER BY prm.[parameter_id];

Jeśli zauważysz jakiekolwiek różnice, musisz zaktualizować instrukcję CREATE, tak aby zawierała prawidłowe wartości domyślne. Na przykład, jeśli masz:

@SomeParam [nvarchar](1 - 4000) = N``

Następnie musisz zaktualizować tę część skryptu T-SQL, aby zamiast tego była:

@SomeParam [nvarchar](1 - 4000) = NULL

A następnie ponownie uruchom CREATE (być może będziesz musiał najpierw DROP istniejący obiekt opakowujący T-SQL, albo zmienić CREATE na {{ X3}}).

Zagłosuj na ten raport o błędzie opinii, który zamieściłem powyżej. Dzięki!

Aby uzyskać więcej informacji na temat pracy z SQLCLR w ogóle, odwiedź: Info SQLCLR

1
Solomon Rutzky 14 styczeń 2020, 20:19