2016-04-08 17 views
0

Ich habe eine Anforderung zum Erstellen einer Sicht in SQL 2012, das Skript läuft in SSMS als Standalone, muss aber in eine Ansicht konvertieren, jedoch verwendet das Skript eine CLR zu generieren Schlüsseldaten. Bis jetzt haben wir das CLR-Ergebnis in eine temporäre Tabelle gebracht und von dort aus hinzugefügt. Da temporäre Tabellen in einer Ansicht nicht zulässig sind, verwenden wir stattdessen eine Variable für die Tabelle, die jedoch einen Fehler um den Deklarationsteil verursacht. Wir haben offensichtlich versucht, es als ein gespeichertes Proc auszuführen, aber das kann nicht aus einer Sicht aufgerufen werden ... Irgendwelche Vorschläge würden geschätzt werden.Kann nicht verwenden, deklarieren oder temporäre Tabelle in SQL-Ansicht, Vorschläge bitte

Dies ist der Arbeitscode

declare @idList IdList 
INSERT INTO @idList SELECT distinct RT_ID FROM [RT] 
DECLARE @CLRs TABLE (
RT_ID nvarchar(19) 
,rowindex nvarchar(20) 
,Exp1 nvarchar(20) 
,Exp2 nvarchar(20) ) 

INSERT INTO @CLRs 
SELECT [IDLIST].[id] as RT_ID 
,AD.ROWINDEX 
,dbo.fnPropercase(Contact) as Exp1 
,dbo.fnPropercase(Contact2) as Exp2 
from @idList [IDLIST] 
LEFT OUTER JOIN [CLR DETAILS](@idList,1) [AD] on [IDLIST].[id] = [AD].RT_ID 
INNER JOIN CONTACTS CS on CS.CONTACTS_ID= AD.RT_CONT_ID 
SELECT * FROM @CLRs 

Offensichtlich ist dies ein vereinfachtes Skript ist aber die Absicht ist es noch

Thankyou zu sehen.

+0

Etwas scheint hier weg. Was genau macht der SQLCLR TVF? Ist es wirklich SQLCLR? Es sieht so aus, als ob '@ idList' ein benutzerdefinierter Tabellentyp ist, aber Sie können diese nicht an SQLCLR-Objekte übergeben. Ist die obige Abfrage wirklich der Arbeitscode, oder wurde sie für den Zweck der Veröffentlichung auf einer öffentlichen Website geändert? Wie dem auch sei, ist dies ein sehr verwirrender Code, insbesondere weil die meisten Objekt- und Feldnamen bedeutungslos sind. Und gibt es wirklich einen Platz im Objektnamen '[CLR DETAILS]'? Wenn dies der Fall ist, sollten Sie in Betracht ziehen, dies zu entfernen, da es viel einfacher ist, mit ihm zu arbeiten, wenn kein Platz ist. –

Antwort

1

CTEs sind die Antwort.

WITH 
    IdList AS (SELECT distinct RT_ID FROM [RT]), 
    CLRs AS (SELECT [IDLIST].[id] AS RT_ID 
        ,AD.ROWINDEX 
        ,dbo.fnPropercase(Contact) AS Exp1 
        ,dbo.fnPropercase(Contact2) AS Exp2 
      FROM IdList [IDLIST] 
      LEFT OUTER JOIN [CLR DETAILS](IdList,1) [AD] 
       ON [IDLIST].[id] = [AD].RT_ID 
      INNER JOIN CONTACTS CS 
       ON CS.CONTACTS_ID = AD.RT_CONT_ID) 
    SELECT * FROM CLRs 

Das oben genannte sollte Ihre Sichtdefinition sein. Wie Sie erwähnt haben, dass dies ein vereinfachter Fall ist, fühlen Sie sich frei, mehr hinzuzufügen CTE s und JOIN sie, wie Sie wünschen!

Dokumentation: MDSN - CTEs

+0

Vielen Dank für Ihre Zeit @freakyhat, ja, CTE's waren die Antwort! – user3735855

+0

Ihre Begrüßung! Bitte markieren Sie die Antwort als richtig :) – freakyhat