从CLR内部的SQL函数获取字符串值

本文关键字:获取 字符串 函数 SQL CLR 内部 | 更新日期: 2023-09-27 18:25:03

下面包含尝试的(非工作的)解决方案。我有一个名为get_parameter的sql函数,它在表中查找给定的字符串并返回关联的字符串:

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;
        }
    }

然而,这是行不通的。当它从get_parameter返回时,它总是认为cnt的值为null(或空)。

根据请求,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

我已经按照下面的Mike Dinescu尝试了解决方案,但问题是对ExecuteScalar()的调用仍然返回null。我确实尝试更改为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";

从CLR内部的SQL函数获取字符串值

如果要从.NET执行用户定义的函数或存储过程,则应将CommandType设置为CommandType.StoredProcedure,并在执行命令之前向命令对象添加所需的参数。

 command.CommandType = CommandType.StoredProcedure;
 command.CommandText = @"dbo.get_parameter";
 // here you add the paramters needed for your procedure/function
 //   in your case it will be just one (make sure you add the correct name for you function)
 command.Parameters.Add(new SqlParamter("SelectedParameterName", SqlDbType.NVarChar));
 command.Prepare();
 command.Parameters[0].Value = "filecount";
 string cnt = (string)command.ExecuteScalar();