Verwendung von SMO zu erstellung eigener Funktionen

18/09/2007 - 11:12 von Grumbach, Andre | Report spam
Hallo zusammen,
ich versuche gerade über Smo eigen Funktionen zu erstellen.
Bei Scalar Funktionen ist das ganze auch kein Problem, die funktionieren
wunderbar.

Wie sieht es aber mit Tabellen Funktionen aus?

Wie kann hier hier den Rückgabetype angeben (Smo.DataType.Table existiert
nicht).

Hat mir jemand ein Beispiel wie ich solche Funktionen erstelle?

Danke,
Andre
 

Lesen sie die antworten

#1 Elmar Boye
18/09/2007 - 13:19 | Warnen spam
Hallo Andre,

Grumbach, Andre schrieb ...
ich versuche gerade über Smo eigen Funktionen zu erstellen.
Bei Scalar Funktionen ist das ganze auch kein Problem, die funktionieren
wunderbar.



Ich verstehe zwar nicht wieso man sich dazu durch SMO
quàlt anstatt gleich den T-SQL Text via ExecuteNonQuery
zu übertragen...

Wie sieht es aber mit Tabellen Funktionen aus?

Wie kann hier hier den Rückgabetype angeben (Smo.DataType.Table existiert
nicht).



Die Rückgabe erfolgt über den Tabellennamen und die Spalten
werden in der Columns Auflistung angegeben.

Hat mir jemand ein Beispiel wie ich solche Funktionen erstelle?



Für das triviale T-SQL:
CREATE FUNCTION [dbo].[SelectCustomer](@CustomerID [nchar](5))
RETURNS @Customers TABLE (
[CustomerID] [nchar](5),
[CompanyName] [nvarchar](60)
) AS
BEGIN
INSERT @Customers(CustomerID, CompanyName)
SELECT CustomerID, CompanyName FROM dbo.Customers
WHERE CustomerID = @CustomerID;
RETURN;
END


ergàbe das mit VB.NET:

///
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Common

Public Class SmoUdf

Public Shared Sub Create()
Dim localServer As New Server(New ServerConnection("(local)\SQL2005"))
Dim db As Database = localServer.Databases("Northwind")

Dim iniFields As System.Collections.Specialized.StringCollection
iniFields = localServer.GetDefaultInitFields(GetType(UserDefinedFunction))
iniFields.AddRange(New String() {"Name", "Schema"})
localServer.SetDefaultInitFields(GetType(UserDefinedFunction), iniFields)

CreateTableUdf(db)

End Sub

Public Shared Sub CreateTableUdf(ByVal db As Database)
Dim udf As UserDefinedFunction
Dim doAlter As Boolean = False

If Not db.UserDefinedFunctions.Contains("SelectCustomer", "dbo") Then
udf = New UserDefinedFunction(db, "SelectCustomer", "dbo")
Else
udf = db.UserDefinedFunctions("SelectCustomer", "dbo")
doAlter = True
End If

udf.QuotedIdentifierStatus = True
udf.TextMode = False
udf.FunctionType = UserDefinedFunctionType.Table
udf.ImplementationType = ImplementationType.TransactSql

udf.Parameters.Add(New UserDefinedFunctionParameter(udf, "@CustomerID", DataType.NChar(5)))
udf.TableVariableName = "@Customers"
udf.Columns.Add(New Column(udf, "CustomerID", DataType.NChar(5)))
udf.Columns.Add(New Column(udf, "CompanyName", DataType.NVarChar(60)))

udf.TextBody = "BEGIN" & Environment.NewLine & _
ChrW(9) & "INSERT @Customers(CustomerID, CompanyName)" & Environment.NewLine & _
ChrW(9) & "SELECT CustomerID, CompanyName FROM dbo.Customers" & Environment.NewLine & _
ChrW(9) & "WHERE CustomerID = @CustomerID;" & Environment.NewLine & _
ChrW(9) & "RETURN;" & Environment.NewLine & _
"END" & Environment.NewLine

If doAlter Then
udf.Alter()
Else
udf.Create()
udf.Grant(New ObjectPermissionSet(ObjectPermission.Select), "public")
End If
End Sub

End Class

\\\

Gruss
Elmar

Ähnliche fragen