CREATE PROCEDURE получает «Msg 6567, уровень 16, состояние 2» для хранимой процедуры SQLCLR - PullRequest
3 голосов
/ 29 октября 2019

У меня проблема с получением SQL Server для создания хранимой процедуры для моей функции CLR.

Это ошибка, которую я получаю:

Msg 6567, Уровень 16, Состояние 2, Процедура PerfInsert, Строка 12 [Стартовая Строка 0 Строка] *
СОЗДАТЬ ПРОЦЕДУРУ не удалось, так какПроцедура CLR может быть определена только для методов CLR, которые возвращают либо SqlInt32, System.Int32, System.Nullable, void.

Что я делаю неправильно?

(Обновлено) C # code:

using Microsoft.SqlServer.Server;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Diagnostics;

    namespace MiddleMan
{
    public static class MiddleMan
    {
        [SqlProcedure(Name = "PerfInsert")]
        public static SqlInt32 CreateCommand(SqlChars tblString, SqlChars featureName, SqlChars connectionString, SqlChars perfionConnectionString, SqlChars logFile)
        {
            Process compiler = new Process();
            compiler.StartInfo.FileName = "C:\\SQL Server C# Functions\\PerfionLoader\\PerfionLoader\\bin\\Release\\PerfionLoader.exe";
            compiler.StartInfo.Arguments = tblString.Value + " " + featureName.Value + " " + connectionString.Value + " " + perfionConnectionString.Value + " " + logFile.Value;
            //compiler.StartInfo.UseShellExecute = false;
            //compiler.StartInfo.RedirectStandardOutput = true;
            compiler.Start();
            return SqlInt32.Zero;
        }
    }
}

(обновлено) Код SQL:

CREATE PROCEDURE PerfInsert
    (
        @tblString nvarchar(max)
        , @featureName nvarchar(max)
        , @connectionString nvarchar(max)
        , @perfionConnectionString nvarchar(max)
        , @logFiel nvarchar(max)
    )
    AS EXTERNAL NAME PerfInsert.[MiddleMan.MiddleMan].[CreateCommand]
GO

Ответы [ 2 ]

3 голосов
/ 30 октября 2019

Вам нужно украсить метод с помощью:

[SqlProcedure()]
public static SqlInt32 ...
{
  ...
}

И, SQLCLR не работает с VARCHAR. Вам нужно будет изменить определение T-SQL, чтобы использовать NVARCHAR(4000). Если 4000 недостаточно, вы можете использовать MAX, но если гарантируется, что ввод будет не более 4000 байтов, то 1 - 4000 более эффективен. Может не иметь значения, но хорошая привычка иметь: -).

Кроме того, лучше всего, если вы используете типы Sql* для входных параметров. То есть используйте SqlString и получите значение из param.Value.

Похожие сообщения:

  1. System.Web в SQL Server Функция CLR (в DBA.StackExchange)
  2. System.Security.SecurityException с функцией CLR
1 голос
/ 30 октября 2019

Вам не нужно нужно SqlProcedureAttribute. Это просто метаданные, чтобы сообщить SSDT о том, что они должны выдавать CREATE PROCEDURE. Хранимая процедура должна использовать NVARCHAR(MAX) для соответствия System.String. EG:

Скомпилируйте этот файл C # в .dll:

c:\test> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc /target:library .\proc.cs

, затем:

create assembly PerfInsert from 'c:\test\proc.dll'
WITH PERMISSION_SET = UNSAFE;  
go
CREATE PROCEDURE PerfInsert
    (@tblString NVARCHAR(max),
     @featureName NVARCHAR(max),
     @connectionString NVARCHAR(max),
     @perfionConnectionString NVARCHAR(max),
     @logFiel NVARCHAR(max)
    )
AS EXTERNAL NAME PerfInsert.[MiddleMan.MiddleMan].[CreateCommand]
GO
...