更新:2007 年 11 月
本主题适用于:
| 版本 | Visual Basic | C# | C++ | Web Developer | 
|---|---|---|---|---|
| 速成版 | .gif) | .gif) | .gif) | .gif) | 
| 标准版 | .gif) | .gif) | .gif) | .gif) | 
| 专业团队版 | .gif) | .gif) | .gif) | .gif) | 
表格图例:
| .gif) | 适用 | 
| .gif) | 不适用 | 
| .gif) | 默认情况下隐藏的一条或多条命令。 | 
此示例演示如何调试 SQL CLR 用户定义的类型。它在 AdventureWorks 示例数据库中创建一个新的 SQL CLR 类型。该类型随后用于表定义、INSERT 语句以及 SELECT 语句中。
| .gif) 说明: | 
|---|
| 显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 | 
调试 CLR SQL 用户定义的类型
- 在一个新的 SQL Server 项目中,建立一个到 AdventureWorks 示例数据库的连接。有关更多信息,请参见如何:连接到数据库。 
- 使用下面第一个示例部分中的代码创建一个新的类型,并将其命名为“Point.cs”。有关更多信息,请参见 如何:使用 SQL Server 项目类型进行开发。 
- 添加测试该类型的脚本。在“解决方案资源管理器”中,右击“TestScripts”目录,单击“添加测试脚本”,然后插入下面的第二个示例部分中的代码。以“Point.sql”名称保存文件。右击该文件名,然后单击“设置为默认调试脚本”。 
- 添加断点。 - 在“服务器资源管理器”的“类型”文件夹中,打开“Point”。 
- 将断点放在每个方法内,以便可以观察该类型内的控制流。 
 
- 从“调试”菜单中,选择“启动”对该项目进行编译、部署和单元测试。以黄色箭头表示的指令指针出现在断点上时,说明正在调试函数。 
- 尝试不同的调试功能。 - 对于“Point.sql”脚本中的每条 INSERT 语句,都会执行一次 Parse 方法。通过在“调试”菜单上重复单击“逐语句”,可监视该方法如何将一个用冒号分隔的数字对转换为 Point 对象。 
- 在“局部变量”窗口中,打开变量 pt,它包含正在生成的当前 Point。 
- 在文本编辑器中,双击 pt 变量以选择它。将 pt 拖到“监视”窗口中的任何位置。pt 现在就添加到受监视变量的列表中了,您就可以在生成 Point 时对该变量进行观察。 
- 逐句通过该类几次并观察 INSERT 和 SELECT 所通过的路径之间的差异。 
- 再次按“继续”完成函数调试。 
 
示例
这是定义此示例中所使用类型的代码。此代码创建名为 Points 的表、向其中插入行并输出表的内容。请注意,在创建表和访问表之间不必包含批命令 GO。实际上,Visual Studio 2005 会将 GO 解释为无效的 SQL 命令。
using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Runtime.Serialization;
[Serializable, SqlUserDefinedTypeAttribute(Format.Native)]
public struct Point: INullable
{
    private bool m_isNull;
    private double m_x;
    private double m_y;
    public bool IsNull {
        get { return (m_isNull); }
    }
    public override string ToString()
    {
        if (this.IsNull) { return "NULL"; }
        else { return this.m_x + ":" + this.m_y; }
    }
    public static Point Parse(SqlString s)
    {
        if (s.IsNull) { return Null; }
        else
        {
            // Parse input string here to separate out points:
            Point pt = new Point();
            string str = Convert.ToString(s);
            string[] xy = str.Split(':');
            pt.X = Convert.ToDouble(xy[0]);
            pt.Y = Convert.ToDouble(xy[1]);
            return (pt);
        }
    }
    public static Point Null
    {
        get
        {
            Point pt = new Point();
            pt. m_isNull = true;
            return (pt);
        }
    }
    public double X
    {
        get { return (this.m_x); }
        set { m_x = value; }
    }
    public double Y
    {
        get { return (this.m_y); }
        set { m_y = value; }
    }
}
这是调用此函数的测试脚本。
CREATE TABLE dbo.Points ( 
            ID int IDENTITY(1,1) PRIMARY KEY, 
            Pnt Point) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '3:4')) 
INSERT INTO dbo.Points (Pnt) VALUES (CONVERT(Point, '-1:5')) 
INSERT INTO dbo.Points (Pnt) VALUES (CAST ('1:99' AS Point)) 
SELECT ID, 
        Pnt.ToString() as StringPoint, 
        Pnt.X as X, 
        Pnt.Y as Y      
FROM dbo.Points
请参见
任务
如何:创建和运行 CLR SQL Server 用户定义的类型