2016-12-12 2 views
2

Ich habe ein seltsames Verhalten von SQL Server 2016 beim Umgang mit defekten Pipes in R-Skripts gefunden. Sehen Sie sich die T-SQL-Code unten:R-Skripts in SQL Server 2016 beschädigt mit  Zeichen

DECLARE 
    @r nvarchar(100) 

/* Create a data frame with a broken pipe as one of its fields and a simple ASCII encoded string in another. */ 
SET @r = N' 
df <- data.frame(
    a = "¦", 
    b = "a,b,c" 
    )'; 

/* Print @r to detect the inclusion of any unwanted characters. */ 
PRINT @r; 

/* Execute and retrieve the output. */ 
EXECUTE sp_execute_external_script 
    @language = N'R', 
    @script = @r, 
    @output_data_1_name = N'df' 
WITH RESULT SETS ((
    BadEncodingColumn varchar(2), 
    GoodEncodingColumn varchar(5) 
    )); 

Der Druckbefehl gibt diese in der Registerkarte Nachrichten:

df <- data.frame(
    a = "¦", 
    b = "a,b,c" 
    ) 

Allerdings sieht die letzte Registerkarte Ergebnisse wie folgt aus:

BadEncodingColumn GoodEncodingColumn 
¦     a,b,c 

Diese Das Verhalten scheint in der EXECUTE sp_execute_external_script-Phase des Skripts aufzutauchen, und ich habe dieses Zeichen() beim Umgang mit anderen Codierungsproblemen mit Excel, R und anderen Versionen von SQL Server gesehen.

Irgendwelche Lösungen für dieses Verhalten? Und Bonuspunkte, was ist besonders an dem Charakter?

Edit: Ich habe versucht, mit Datentypen in SQL Server und R vergeblich versucht.

+0

warum wurde nicht wirklich sicher, folgt dieser Downvoted, scheint wie eine valide und neue Frage an mich. –

Antwort

3

Das Problem scheint mit der Codierung von Nicht-ASCII-Zeichen im R-Skript zu sein (gebrochene Pipe liegt außerhalb der 128 ASCII-Zeichen). Sie können die Codierung mithilfe der Funktion "Codierung" explizit zu Unicode (UTF-8) überschreiben, um das Problem zu umgehen. Zum Beispiel kann das Skript aktualisiert werden als

DECLARE 
    @r nvarchar(100) 

/* Create a data frame with a broken pipe as one of its fields and a simple ASCII encoded string in another. */ 
SET @r = N' 
df <- data.frame(
    a = "¦", 
    b = "a,b,c" 
    ) 

Encoding(levels(df$a)) <- "UTF-8" ###### Encoding override' 

/* Print @r to detect the inclusion of any unwanted characters. */ 
PRINT @r; 

/* Execute and retrieve the output. */ 
EXECUTE sp_execute_external_script 
    @language = N'R', 
    @script = @r, 
    @output_data_1_name = N'df' 
WITH RESULT SETS ((
    BadEncodingColumn varchar(2), 
    GoodEncodingColumn varchar(5) 
    )); 

erzeugt die folgenden Ergebnisse

BadEncodingColumn GoodEncodingColumn 
¦     a,b,c 
+0

Vielen Dank dafür! –