1

I unten skalare Funktion haben:SQL Server - Konvertieren Skalarfunktion in Tabellenwertfunktion

CREATE FUNCTION [dbo].[GetStringIds] 
(
    @IdsTbl ids READONLY 
) 
RETURNS nvarchar(800) 
AS 
BEGIN 
    DECLARE @IdsLst nvarchar(800); 

    SELECT 
      @IdsLst = COALESCE(@IdsLst + ', ', '') + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')' 
     FROM 
      @IdsTbl 

    Return @IdsLst 
END 

Ein Tabellentyp ist dieser Skalar-Funktion übergeben, die zwei Felder ID1 und ID2 enthält, die beide int-Typ. Diese Funktion baut ein Zeichenketten wie folgt:

(12: 2), (23: 4), (4: 34)

HINWEIS: ID1 wiederholt werden kann, aber nicht ID2, ID1 + ID2 ist Primärschlüssel. Zum Beispiel:

ID1 | ID2 
1  100 
1  200 
1  110 
2  500 
3  200 
3  600 

Nun, ich frage mich, ob es besser ist, es in eine Tabelle bewertet Funktion zu konvertieren, um die Datenbankleistung in Bezug auf die Ausführungszeit zu erhöhen.

Also in diesem Fall, wenn ich es in eine Tabellenwertfunktion umwandeln, wird es Leistung erhöhen? Wird die Ausführungszeit verkürzt? Wenn ja, wie kann es in eine Tabellenwertfunktion umgewandelt werden? Ich habe Probleme, es zu konvertieren, da ich eine Variable deklarieren muss, in der verketten.

+0

Welche Tabelle möchten Sie zurückgeben? Ich meine, was werden die Säulen sein? –

+0

In der Tat müssen Sie keine Variable deklarieren, um Strings zu verketten, da es Möglichkeiten gibt, Daten von Abfragen ohne Variablen zu verketten. Zum Beispiel http://stackoverflow.com/questions/13639262/optimal-way-to-concatenate-aggregate-strings –

+0

@ZoharPeled die Tabelle, die ich zurückgeben möchte, ist immer eine Zeile mit einer Spalte und diese Spalte ist ein Nvarchar (die Verkettung Ergebnis). – user1624552

Antwort

0

Normalerweise verwende ich Konstruktion wie folgt aus:

select 
    (select '' + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')' 
     from @IdsTbl 
     for xml path ('') 
    ) 
0
create function dbo.GetStringIds (@IdsTbl dbo.ids readonly) 
    returns table as return 
    select IdsLst = stuff(
    (select ', (' + cast(id1 as nvarchar(13)) 
      + ' : ' + cast(id2 as nvarchar(13)) + ')' 
     from @IdsTbl i 
     for xml path (''), type).value('.','nvarchar(800)') 
    ,1,2,''); 

Inline Scalar Functions - Itzik Ben-Gan

0

Sie können so etwas tun,

CREATE FUNCTION [dbo].[GetStringIds] (@IdsTbl ids READONLY) 
Returns Table 
Return (
    SELECT 
     @IdsLst = COALESCE(@IdsLst + ', ', '') + '(' + CAST(ID1 AS NVARCHAR) + ' : ' + CAST(ID2 AS NVARCHAR) + ')' 
    FROM 
     @IdsTbl 
) 

Dies kann arbeiten, wie meine Anforderung anders war als ich versuchte, um es zu bearbeiten. Auf das Beste hoffen.

Verwandte Themen