Como: Criar e executar um tipo de SQL Server User-Defined usando a integração do Common Language Runtime
Criar um tipo definido pelo usuário do SQL adicionando um Tipo definido pelo usuário a um projeto de banco de dados SQL Server Common Language Runtime (CLR SQL). Após a implantação bem-sucedida, você pode usá-lo em todos os contextos nos quais você pode usar um tipo de sistema. Isso inclui definições de coluna, variáveis, parâmetros, resultados de funções, cursores, disparadores e replicação. Tipos definidos pelo usuário fornecem extensibilidade do sistema de tipo de dados SQL Server ao usuário e também a capacidade de definir tipos estruturados complexos.
![]() |
---|
Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Configurações do Visual Studio. |
Criando um tipo definido pelo usuário
Para criar um tipo SQL definido pelo usuário
Abra um existente Projeto de banco de dados do CLR SQL, ou criar um novo. Para obter mais informações, consulte Como: Criar um projeto para os objetos de banco de dados que usam a integração de tempo de execução de linguagem comum SQL Server.
No menu Project, selecione Add New Item.
No Add New Item caixa de diálogo, selecione Tipo definido pelo usuário.
Digite um Name para o novo tipo definido pelo usuário.
Adicione um código para definir e criar o tipo definido pelo usuário. Consulte o primeiro exemplo que segue este procedimento.
No Solution Explorer, abra a pasta TestScripts e clique duas vezes no arquivo Test.sql.
Observação
Você pode especificar outros scripts como o seu script de depuração padrão. Para obter mais informações, consulte Como: Edite o Script de Test. SQL para executar objetos usar a integração de tempo de execução de linguagem comum de SQL Server.
Adicione código ao arquivo Test.sql (debug.sql no Visual C++) para executar o tipo definido pelo usuário. Consulte o segundo exemplo que segue este procedimento.
Pressione F5 para criar, implantar e depurar o tipo definido pelo usuário. Para obter informações sobre como implantar sem depuração, consulte Como: Implantar itens de projeto de banco de dados do CLR de SQL um SQL Server.
Importante
SQL Server 2005e SQL Server 2008 oferece suporte somente a os projetos deSQL Server que foram criados com o 2.0, 3.0 ou versão 3.5 do.NET Framework. Se você tentar implantar um SQL Server projeto SQL Server 2005 ou SQL Server 2008, um erro será exibida: Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(onde AssemblyName é o nome do assembly que você estiver implantando). Para obter mais informações, consulte Como: Criar um projeto para os objetos de banco de dados que usam a integração de tempo de execução de linguagem comum SQL Server.
Exibir os resultados mostrados na Janela de saída e selecione Show output from: Saída de banco de dados.
Exemplo
Este exemplo cria um tipo Point que você pode usar como faria com outros tipos simples. A declaração de classe está decorada com ambos os atributos Serializable e SqlUserDefinedTypeAttribute. A propriedade Format de SqlUserDefinedTypeAttribute determina o formato de armazenamento do tipo definido pelo usuário. O tipo implementa conversão da sequência de caracteres através da implementação dos métodos Parse e ToString. O tipo também implementa dois procedimentos de propriedade para obter e definir os valores de X e Y para o ponto representado por esta classe.
Imports System
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
<Serializable()>
<SqlUserDefinedType(Format.Native)>
Public Structure Point
Implements INullable
Private m_x As Int32
Private m_y As Int32
Private is_Null As Boolean
Public Property X() As Int32
Get
Return (Me.m_x)
End Get
Set(ByVal Value As Int32)
m_x = Value
End Set
End Property
Public Property Y() As Int32
Get
Return (Me.m_y)
End Get
Set(ByVal Value As Int32)
m_y = Value
End Set
End Property
Public ReadOnly Property IsNull() As Boolean Implements INullable.IsNull
Get
Return is_Null
End Get
End Property
Public Shared ReadOnly Property Null() As Point
Get
Dim pt As Point = New Point
pt.is_Null = True
Return pt
End Get
End Property
Public Overrides Function ToString() As String
If Me.IsNull() Then
Return Nothing
Else
Return Me.m_x & ":" & Me.m_y
End If
End Function
Public Shared Function Parse(ByVal s As SqlString) As Point
If s = SqlString.Null Then
Return Null
End If
If s.ToString() = SqlString.Null.ToString() Then
Return Null
End If
If s.IsNull Then
Return Null
End If
'Parse input string here to separate out coordinates
Dim str As String = Convert.ToString(s)
Dim xy() As String = str.Split(":"c)
Dim pt As New Point()
pt.X = CType(xy(0), Int32)
pt.Y = CType(xy(1), Int32)
Return (pt)
End Function
Public Function Quadrant() As SqlString
If m_x = 0 And m_y = 0 Then
Return "centered"
End If
Dim stringResult As String = ""
Select Case m_x
Case 0
stringResult = "center"
Case Is > 0
stringResult = "right"
Case Is < 0
stringResult = "left"
End Select
Select Case m_y
Case 0
stringResult = stringResult & " center"
Case Is > 0
stringResult = stringResult & " top"
Case Is < 0
stringResult = stringResult & " bottom"
End Select
Return stringResult
End Function
End Structure
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable()]
[SqlUserDefinedType(Format.Native)]
public struct Point : INullable
{
private Int32 m_x;
private Int32 m_y;
private bool is_Null;
public Int32 X
{
get
{
return (this.m_x);
}
set
{
m_x = value;
}
}
public Int32 Y
{
get
{
return (this.m_y);
}
set
{
m_y = value;
}
}
public bool IsNull
{
get
{
return is_Null;
}
}
public static Point Null
{
get
{
Point pt = new Point();
pt.is_Null = true;
return (pt);
}
}
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;
}
// Parse input string here to separate out coordinates
string str = Convert.ToString(s);
string[] xy = str.Split(':');
Point pt = new Point();
pt.X = Convert.ToInt32(xy[0]);
pt.Y = Convert.ToInt32(xy[1]);
return (pt);
}
public SqlString Quadrant()
{
if (m_x == 0 && m_y == 0)
{
return "centered";
}
SqlString stringReturn = "";
if (m_x == 0)
{
stringReturn = "center";
}
else if (m_x > 0)
{
stringReturn = "right";
}
else if (m_x < 0)
{
stringReturn = "left";
}
if (m_y == 0)
{
stringReturn = stringReturn + " center";
}
else if (m_y > 0)
{
stringReturn = stringReturn + " top";
}
else if (m_y < 0)
{
stringReturn = stringReturn + " bottom";
}
return stringReturn;
}
}
Adicione código para executar e testar seu tipo definido pelo usuário (Point) para o Test. SQL de arquivo na TestScripts pasta no seu projeto. Por exemplo, para verificar o novo tipo, crie uma tabela que usa esse tipo. O exemplo a seguir demonstra como usar o tipo Point na criação de tabela.
CREATE TABLE test_table (column1 Point)
go
INSERT INTO test_table (column1) VALUES ('1:2')
INSERT INTO test_table (column1) VALUES ('-2:3')
INSERT INTO test_table (column1) VALUES ('-3:-4')
select column1.Quadrant() from test_table
Consulte também
Tarefas
Como: Criar e executar um disparador de SQL Server usando a integração do Common Language Runtime
Como: Criar e executar um agregado de SQL Server usando a integração do Common Language Runtime
Demonstra Passo a passo: Criar um procedimento armazenado no código gerenciado
Como: Depurar um CLR SQL procedimento armazenado
Referência
Atributos para objetos de banco de dados e de projetos de banco de dados do CLR de SQL
Conceitos
Introduction to SQL Server CLR Integration (ADO.NET)
Vantagens de usar código gerenciado para criar objetos de bancos de dados
Iniciando a equipe de desenvolvimento de bancos de dados que objetos de referência SQLCLR
Criar objetos de SQL Server no código gerenciado