注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Computer Science

I Pressed My Words Here. Will You Read ?

 
 
 

日志

 
 

SQL Server CLR 实现在函数中动态查询  

2011-09-02 11:04:45|  分类: With Windows |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
打开Microsoft Virtual Studio ,新建项目,选择语言(我这里选择的是C Sharp),选择“数据库”项,编辑名称并创建。
这时,会有一个链接数据库设置的窗口,可以填写配置,这样,当C#程序写完后,点击Ctrl+F5便能自动编译并部署到数据库中。
在项目中新建一个用户自定义函数。并在其中编写函数,用于动态查询表中的字段:

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

public partial class UserDefinedFunctions
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static string ReturnNVARCHAR(string v_sqlStr)
    {
        string returnValue = "ERROR:";
        if (v_sqlStr.ToLower() == "null" || v_sqlStr.Trim().Length == 0)
        {
            v_sqlStr = "SELECT NULL";
        }
        try
        {
            using (SqlConnection conn
                = new SqlConnection("context connection=true"))
            using (SqlCommand cmd = new SqlCommand(
                v_sqlStr, conn))
            {
                conn.Open();
                using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    if (dr.HasRows)
                    {
                        int v_count = 0;
                        while (dr.Read())
                        {
                            if (dr.FieldCount == 0)
                            {// 未能获得数据
                                returnValue = "ERROR:未能获得数据";
                                break;
                            }
                            else if (dr.FieldCount > 1)
                            {//获得的数据集中,存在多列值。
                                returnValue = "ERROR:存在多列值。";
                                break;
                            }
                            if (v_count > 0)
                            {//获得的数据有多行
                                returnValue = "ERROR:存在多行值";
                                break;
                            }
                            returnValue = dr.GetValue(0).ToString();//以字符串的形式接收值
                            v_count++;
                        }
                    }
                    else
                    {// 未能获得数据
                        returnValue = "ERROR:未能获得数据";
                    }
                }

                return returnValue;
            }
        }
        catch (Exception e)
        {
            return "ERROR:" + e.ToString();
        }
    }
}

写好后,Ctrl+F5,然后便能在数据库的可编程-程序集中看到新增了一个程序集,关键是,函数中新增了ReturnNVARCHAR()这个函数。
注意,当调用这个函数,获得返回字段以"ERROR:"开头时,表示出错了。
SQL Server中调用函数的代码:

    DECLARE @v_rs NVARCHAR(MAX)=NULL

    SET @v_rs=[dbo].[ReturnNVARCHAR] (@str_sql)
    /*当dbo.ReturnNVARCHAR未能查询到值,或者查询到多条满足查询条件的值时,返回以ERROR:开头的字符串。*/
    --IF PATINDEX('ERROR:%',@v_rs)= 1
   --     SET @v_rs = NULL

.
  评论这张
 
阅读(894)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017