Попытка (нерабочее) решение включено ниже. У меня есть функция под названием SQL get_parameter, которая выглядит в таблице для данной строки и возвращает соответствующую строку:Получение строкового значения из функции SQL внутри CLR
declare @str varchar(20);
set @str = dbo.get_parameter('filecount')
print @str
Это работает! Я запускаю это, и он печатает именно то, что он должен печатать. В этом случае параметр представляет собой строку «44».
Теперь я хочу запустить C# CLR. Но я хочу, чтобы CLR могла найти необходимый параметр.
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static string Import_TestFunc()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlCommand command = new SqlCommand();
command.Connection = conn;
conn.Open();
// Find out how many files DSAMS processing requires.
command.CommandText = @"EXEC get_parameter 'filecount' ";
string cnt = (string)command.ExecuteScalar();
if (String.IsNullOrEmpty(cnt))
{
return "'cnt' not found."; // error return code. can't find this parameter.
}
return cnt;
}
}
Однако это не работает. Он постоянно думает, что значение для cnt равно null (или пустое), когда оно возвращается с get_parameter.
В соответствии с просьбой, код для get_parameter
ALTER FUNCTION [dbo].[get_parameter]
(
@SelectedParameterName nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @result nvarchar(max);
SET @result = (SELECT ParameterValue from Parameters WHERE ParameterName = @SelectedParameterName);
RETURN isnull(@result,'');
END
Я попробовал решение в соответствии с Майком Динеску ниже, но проблема в том, что вызов ExecuteScalar() по-прежнему возвращает нуль. Я стараюсь, чтобы изменить CommandType.Text и в этом случае я получаю следующее интересное сообщение:
A .NET Framework error occurred during execution of user-defined routine or aggregate "Import_TestFunc":
System.Data.SqlClient.SqlException: Procedure or function 'get_parameter' expects parameter '@SelectedParameterName', which was not supplied.
Это интересно, потому что я смотрел прямо на то, где он добавляет @SelectedParameterName параметра.
command.Parameters.Add(new SqlParameter("@SelectedParameterName", SqlDbType.NVarChar)).Value = "filecount";
Возможно, вы сравниваете яблоки с апельсинами? Ваша SQL-функция не выполняет точно так же, как ваш ручной скрипт. 'EXEC get_parameter 'filecount'' не совпадает с' SET ... = dbo.get_parameter (' filecount ') '. – stakx
Вы сказали, что это функция, но в вашей CLR, которую вы вызываете как процедура. Измените свой код CLR на «Выберите dbo.get_parameter ('filecount')« –
Покажите нам определение 'dbo.get_parameter'. По крайней мере, заголовок, если не весь организм. – RBarryYoung