2016-09-22 6 views
0

Ich versuche, eine lineare Regression Skript zu umschreiben zu werden eine Funktion, und ich erhalte die folgenden Fehler (die ich ia Thread hier), wenn ich das Skript ausführen:T-SQL-Funktion Syntax

Msg 156 , Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 9 Falsche Syntax in der Nähe des Schlüsselwortes 'WITH'. Nachricht 319, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 9 Falsche Syntax neben dem Schlüsselwort 'mit'. Wenn es sich bei dieser Anweisung um einen allgemeinen Tabellenausdruck, eine xmlnamespaces-Klausel oder eine Änderungsverfolgungskontextklausel handelt, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden. Nachricht 156, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 12 Falsche Syntax neben dem Schlüsselwort 'AS'. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 18 Falsche Syntax in der Nähe von ','. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 28 Falsche Syntax in der Nähe von ','. Msg 102, Ebene 15, Status 1, Prozedur fn_LinearRegression, Zeile 36 Falsche Syntax in der Nähe von ','. Hier

ist die Funktion:

CREATE Function dbo.fn_LinearRegression 
(@groupID varchar(50), @x int, @y float) 
RETURNS @regtable TABLE(a FLOAT, b FLOAT) 
AS 
-- 
WITH some_table as (
select @groupID, @x, @y from TABLENAME -- replace table), 

/*WITH*/ mean_estimates AS 
( SELECT GroupID 
      ,AVG(x)             AS xmean 
      ,AVG(y)             AS ymean 
    FROM some_table pd 
    GROUP BY GroupID 
), 
stdev_estimates AS 
( SELECT pd.GroupID 
      -- T-SQL STDEV() implementation is not numerically stable 
      ,CASE  SUM(SQUARE(x - xmean)) WHEN 0 THEN 1 
      ELSE SQRT(SUM(SQUARE(x - xmean))/(COUNT(*) - 1)) END AS xstdev 
      ,  SQRT(SUM(SQUARE(y - ymean))/(COUNT(*) - 1))  AS ystdev 
    FROM some_table pd 
    INNER JOIN mean_estimates pm ON pm.GroupID = pd.GroupID 
    GROUP BY pd.GroupID, pm.xmean, pm.ymean 
), 
standardized_data AS     -- increases numerical stability 
( SELECT pd.GroupID 
      ,(x - xmean)/xstdev         AS xstd 
      ,CASE ystdev WHEN 0 THEN 0 ELSE (y - ymean)/ystdev END AS ystd 
    FROM some_table pd 
    INNER JOIN stdev_estimates ps ON ps.GroupID = pd.GroupID 
    INNER JOIN mean_estimates pm ON pm.GroupID = pd.GroupID 
), 
standardized_beta_estimates AS 
( SELECT GroupID 
      ,CASE WHEN SUM(xstd * xstd) = 0 THEN 0 
       ELSE SUM(xstd * ystd)/(COUNT(*) - 1) END   AS betastd 
    FROM standardized_data 
    GROUP BY GroupID 
) 
SELECT pb.GroupID 
     ,ymean - xmean * betastd * ystdev/xstdev     AS Alpha 
     ,betastd * ystdev/xstdev         AS Beta 
     ,CASE ystdev WHEN 0 THEN 1 ELSE betastd * betastd END  AS R2 
     ,betastd              AS Correl 
     ,betastd * xstdev * ystdev         AS Covar 

into TT_Auto_Temp_LM -- REPLACE TABLE 
FROM standardized_beta_estimates pb 
INNER JOIN stdev_estimates ps ON ps.GroupID = pb.GroupID 
INNER JOIN mean_estimates pm ON pm.GroupID = pb.GroupID; 

-- 
Insert into @regtable ([A],[B]) VALUES (Alpha, Beta) 

RETURN 

ich nur zwei Ausgänge haben, da ich nur Alpha und Beta benötigen.

+2

'),' nach dem ersten CTE fehlt und nach meinem Wissen DML-Anweisungen in Funktion nicht zulassen, wenn Sie SQL Server verwenden –

+0

Ich sehe nicht a), fehlt und ich habe eine Funktion im Einsatz, die eine INSERT INTO hat Aussage – preston

Antwort

1

In erster Linie haben Sie Syntaxfehler durch die Kommentierung aus der Klammer zu und Komma auf Linie, die auf eine neue Zeile sein müssen generieren:

select @groupID, @x, @y from TABLENAME -- replace table),

Noch wichtiger ist aber, das muss sein eine gespeicherte Prozedur, wie Sie eine insert in eine Tabelle tun und dann versuchen, Daten von ihm auszuwählen (? das ist eigentlich nicht klar aus Ihrem Code), die Sie in einer Funktion nicht tun können.

Per der Dokumentation: https://technet.microsoft.com/en-us/library/ms191320.aspx

Benutzerdefinierte Funktionen nicht verwendet werden können, Aktionen auszuführen, die den Datenbankstatus ändern.

Im Wesentlichen in einer Funktion können Sie nur select Daten.

+0

Danke iamdave. Du hast recht. Ich habe das Skript tatsächlich funktionieren lassen, aber dann habe ich herausgefunden, dass es falsch berechnet :(. – preston