Zuordnungen von Datentypen zwischen R und SQL ServerData type mappings between R and SQL Server

Anwendungsbereich:Applies to: JaSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) und höher JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceAnwendungsbereich:Applies to: JaSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) and later JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance

In diesem Artikel werden die unterstützten Datentypen aufgelistet und die Datentypkonvertierungen ausgeführt, die für die Verwendung des Features zur R-Integration in SQL Server Machine Learning Services gelten.This article lists the supported data types, and the data type conversions performed, when using the R integration feature in SQL Server Machine Learning Services.

R-BasisversionBase R version

SQL Server 2016 R Services und SQL Server Machine Learning Services mit R sind auf bestimmte Versionen von Microsoft R Open ausgerichtet.SQL Server 2016 R Services and SQL Server Machine Learning Services with R are aligned with specific releases of Microsoft R Open. Die neueste Version, SQL Server 2019 Machine Learning Services, baut beispielsweise auf Microsoft R Open 3.5.2 auf.For example, the latest release, SQL Server 2019 Machine Learning Services, is built on Microsoft R Open 3.5.2.

Öffnen Sie RGui in der SQL-Instanz, um die einer bestimmten Instanz von SQL Server zugeordnete R-Version anzuzeigen.To view the R version associated with a particular instance of SQL Server, open RGui in the SQL instance. Beispielsweise lautet der Pfad für die Standardinstanz in SQL Server 2019: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\R_SERVICES\bin\x64\Rgui.exe.For example, the path for the default instance in SQL Server 2019 would be: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\R_SERVICES\bin\x64\Rgui.exe.

Das Tool lädt die R-Basisversion und andere Bibliotheken.The tool loads base R and other libraries. Für jedes Paket, das beim Start der Sitzung geladen wird, werden in Form einer Benachrichtigung Informationen zur Version bereitgestellt.Package version information is provided in a notification for each package that is loaded at session start up.

R- und SQL-DatentypenR and SQL Data Types

SQL ServerSQL Server unterstützt mehrere Dutzend verschiedene Datentypen, hingegen weist R eine beschränkte Zahl von skalaren Datentypen (numerisch, ganzzahlig, komplex, logisch, Zeichen, Datum/Zeit und Rohdaten) auf.While SQL ServerSQL Server supports several dozen data types, R has a limited number of scalar data types (numeric, integer, complex, logical, character, date/time, and raw). Daher ist es möglich, dass bei der Verwendung von Daten aus SQL ServerSQL Server in R-Skripts diese implizit in einen kompatiblen Datentyp konvertiert werden.As a result, whenever you use data from SQL ServerSQL Server in R scripts, data might be implicitly converted to a compatible data type. Da eine exakte automatische Konvertierung jedoch häufig nicht möglich ist, wird ein Fehler zurückgegeben, z. B. "Unhandled SQL data type" (Unbehandelter SQL-Datentyp).However, often an exact conversion cannot be performed automatically, and an error is returned, such as "Unhandled SQL data type".

In diesem Abschnitt werden die bereitgestellten impliziten Konvertierungen sowie nicht unterstützte Datentypen aufgelistet.This section lists the implicit conversions that are provided, and lists unsupported data types. Außerdem werden einige Anleitungen für die Zuordnung von Datentypen zwischen R und SQL Server bereitgestellt.Some guidance is provided for mapping data types between R and SQL Server.

Implizite DatentypkonvertierungenImplicit data type conversions

Die folgende Tabelle zeigt die Änderungen der Datentypen und Werte an, wenn Daten von SQL ServerSQL Server in einem R-Skript verwendet und anschließend an SQL ServerSQL Serverzurückgegeben werden.The following table shows the changes in data types and values when data from SQL ServerSQL Server is used in an R script and then returned to SQL ServerSQL Server.

SQL-TypSQL type R-KlasseR class ResultsettypRESULT SET type KommentareComments
bigintbigint numeric floatfloat Bei der Ausführung eines R-Skripts mit sp_execute_external_script ist der bigint-Datentyp für Eingabedaten zulässig.Executing an R script with sp_execute_external_script allows bigint data type as input data. Da diese jedoch in den numerischen Typ von R konvertiert werden, verlieren sehr hohe Werte oder Werte mit Dezimalstellen an Genauigkeit.However, because they are converted to R's numeric type, it suffers a precision loss with values that are very high or have decimal point values. R unterstützt nur ganze Zahlen bis zu 53 Bit. Höhere Werte verlieren an Genauigkeit.R only support up to 53-bit integers and then it will start to have precision loss.
binary(n)binary(n)
n <= 8000n <= 8000
raw varbinary(max)varbinary(max) Nur als Eingabeparameter und als Ausgabe zulässigOnly allowed as input parameter and output
bitbit logical bitbit
char(n)char(n)
n <= 8000n <= 8000
character varchar(max)varchar(max) Der Eingabedatenframe (input_data_1) wird ohne explizites Festlegen des Parameters stringsAsFactors erstellt, sodass der Spaltentyp von default.stringsAsFactors() in R abhängt.The input data frame (input_data_1) are created without explicitly setting of stringsAsFactors parameter so the column type will depend on the default.stringsAsFactors() in R
datetimedatetime POSIXct datetimedatetime Dargestellt als GMTRepresented as GMT
datedate POSIXct datetimedatetime Dargestellt als GMTRepresented as GMT
decimal(p,s)decimal(p,s) numeric floatfloat Bei der Ausführung eines R-Skripts mit sp_execute_external_script ist der decimal-Datentyp für Eingabedaten zulässig.Executing an R script with sp_execute_external_script allows decimal data type as input data. Da diese jedoch in den numerischen Typ von R konvertiert werden, verlieren sehr hohe Werte oder Werte mit Dezimalstellen an Genauigkeit.However, because they are converted to R's numeric type, it suffers a precision loss with values that are very high or have decimal point values. sp_execute_external_script mit einem R-Skript unterstützt nicht den vollständigen Bereich des Datentyps und würde die letzten paar Dezimalstellen ändern, insbesondere Bruchzahlen.sp_execute_external_script with an R script does not support the full range of the data type and would alter the last few decimal digits especially those with fraction.
floatfloat numeric floatfloat
intint integer intint
moneymoney numeric floatfloat Bei der Ausführung eines R-Skripts mit sp_execute_external_script ist der money-Datentyp für Eingabedaten zulässig.Executing an R script with sp_execute_external_script allows money data type as input data. Da diese jedoch in den numerischen Typ von R konvertiert werden, verlieren sehr hohe Werte oder Werte mit Dezimalstellen an Genauigkeit.However, because they are converted to R's numeric type, it suffers a precision loss with values that are very high or have decimal point values. Manchmal könnten Cent-Werte ungenau sein, und es würde folgende Warnung ausgegeben: Warning: unable to precisely represent cents values (Warnung: Cent-Werte können nicht genau dargestellt werden).Sometimes cent values would be imprecise and a warning would be issued: Warning: unable to precisely represent cents values.
numeric(p,s)numeric(p,s) numeric floatfloat Bei der Ausführung eines R-Skripts mit sp_execute_external_script ist der numeric-Datentyp für Eingabedaten zulässig.Executing an R script with sp_execute_external_script allows numeric data type as input data. Da diese jedoch in den numerischen Typ von R konvertiert werden, verlieren sehr hohe Werte oder Werte mit Dezimalstellen an Genauigkeit.However, because they are converted to R's numeric type, it suffers a precision loss with values that are very high or have decimal point values. sp_execute_external_script mit einem R-Skript unterstützt nicht den vollständigen Bereich des Datentyps und würde die letzten paar Dezimalstellen ändern, insbesondere Bruchzahlen.sp_execute_external_script with an R script does not support the full range of the data type and would alter the last few decimal digits especially those with fraction.
realreal numeric floatfloat
smalldatetimesmalldatetime POSIXct datetimedatetime Dargestellt als GMTRepresented as GMT
smallintsmallint integer intint
smallmoneysmallmoney numeric floatfloat
tinyinttinyint integer intint
uniqueidentifieruniqueidentifier character varchar(max)varchar(max)
varbinary(n)varbinary(n)
n <= 8000n <= 8000
raw varbinary(max)varbinary(max) Nur als Eingabeparameter und als Ausgabe zulässigOnly allowed as input parameter and output
varbinary(max)varbinary(max) raw varbinary(max)varbinary(max) Nur als Eingabeparameter und als Ausgabe zulässigOnly allowed as input parameter and output
varchar(n)varchar(n)
n <= 8000n <= 8000
character varchar(max)varchar(max) Der Eingabedatenframe (input_data_1) wird ohne explizites Festlegen des Parameters stringsAsFactors erstellt, sodass der Spaltentyp von default.stringsAsFactors() in R abhängt.The input data frame (input_data_1) are created without explicitly setting of stringsAsFactors parameter so the column type will depend on the default.stringsAsFactors() in R

Von R nicht unterstützte DatentypenData types not supported by R

Folgende Typen von Datentypkategorien, die vom Typsystem von SQL Server unterstützt werden, verursachen möglicherweise Probleme, wenn Sie an R-Code übergeben werden:Of the categories of data types supported by the SQL Server type system, the following types are likely to pose problems when passed to R code:

  • Im Abschnitt Andere des Artikels zum SQL-Typsystem aufgelistete Datentypen: cursor, timestamp, hierarchyid, uniqueidentifier, sql_variant, xml und tableData types listed in the Other section of the SQL type system article: cursor, timestamp, hierarchyid, uniqueidentifier, sql_variant, xml, table
  • Alle räumlichen TypenAll spatial types
  • imageimage

Datentypen, die möglicherweise schlecht konvertiert werdenData types that might convert poorly

  • Die meisten Datum-/Zeittypen sollten funktionieren; nur dattimeoffset funktioniert nicht.Most datetime types should work, except for datetimeoffset.
  • Die meisten numerischen Datentypen werden unterstützt; allerdings schlagen Konvertierungen von money und smallmoney möglicherweise fehl.Most numeric data types are supported, but conversions might fail for money and smallmoney.
  • varchar wird unterstützt; da jedoch SQL Server grundsätzlich Unicode verwendet, wird empfohlen, wenn möglich nvarchar und andere Unicode-Textdatentypen zu verwenden.varchar is supported, but because SQL Server uses Unicode as a rule, use of nvarchar and other Unicode text data types is recommended where possible.
  • Funktionen aus der RevoScaleR-Bibliothek können mit dem Präfix „rx“ versehen werden, um die binären SQL-Datentypen (binary und varbinary) zu behandeln; in den meisten Szenarios ist für diese Typen jedoch eine spezielle Behandlung vonnöten.Functions from the RevoScaleR library prefixed with rx can handle the SQL binary data types (binary and varbinary), but in most scenarios special handling will be required for these types. In den meisten Fällen funktioniert R-Code nicht mit binären Spalten.Most R code cannot work with binary columns.

Weitere Informationen zu SQL ServerSQL Server-Datentypen finden Sie unter Datentypen (Transact-SQL)For more information about SQL ServerSQL Server data types, see Data Types (Transact-SQL)

Änderungen an den Datentypen zwischen den verschiedenen SQL Server-VersionenChanges in data types between SQL Server versions

Microsoft SQL Server 2016 und höher enthalten Verbesserungen bei der Datentypkonvertierung und verschiedenen anderen Vorgängen.Microsoft SQL Server 2016 and later include improvements in data type conversions and in several other operations. Die meisten dieser Verbesserungen tragen zu einer verbesserten Genauigkeit beim Arbeiten mit Gleitkommatypen bei; außerdem gibt es kleine Änderungen bei Vorgängen mit herkömmlichen datetime-Typen.Most of these improvements offer increased precision when you deal with floating-point types, as well as minor changes to operations on classic datetime types.

Diese Verbesserungen stehen Ihnen standardmäßig zur Verfügung, wenn Sie einen Datenbankkompatibilitätsgrad von 130 oder höher verwenden.These improvements are all available by default when you use a database compatibility level of 130 or later. Wenn Sie allerdings einen anderen Kompatibilitätsgrad verwenden oder über eine ältere Version mit der Datenbank verbunden sind, sehen Sie möglicherweise Unterschiede in der Genauigkeit von Zahlen oder anderen Ergebnissen.However, if you use a different compatibility level, or connect to a database using an older version, you might see differences in the precision of numbers or other results.

Weitere Informationen finden Sie unter SQL Server 2016 improvements in handling some data types and uncommon operations (Verbesserungen der Behandlung einiger Datentypen und seltener Vorgänge in SQL Server 2016).For more information, see SQL Server 2016 improvements in handling some data types and uncommon operations.

Überprüfen R- und SQL-Datenschemas im VorausVerify R and SQL data schemas in advance

Im Allgemeinen ist es empfehlenswert, die str() -Funktion zu verwenden, um die interne Struktur und den Typ des R-Objekts zu erhalten, wenn Sie nicht wissen, wie ein spezieller Datentyp oder eine Datenstruktur in R verwendet wird.In general, whenever you have any doubt about how a particular data type or data structure is being used in R, use the str() function to get the internal structure and type of the R object. Das Ergebnis der Funktion wird in die R-Konsole gedruckt, und ist auch in den Abfrageergebnissen verfügbar, in der Registerkarte Meldungen in Management StudioManagement Studio.The result of the function is printed to the R console and is also available in the query results, in the Messages tab in Management StudioManagement Studio.

Wenn Sie Daten aus einer Datenbank abrufen, um diese in R-Code zu verwenden, sollte Sie in jedem Fall die Spalten entfernen, die nicht in R verwendet werden können. Ebenso sollten Sie die Spalten entfernen, die keinen Nutzen für Ihre Analyse haben, z. B. GUIDs (uniqueidentifier), Zeitstempel und andere Spalten zum Überwachen, oder von ETL-Prozessen erstellte Informationen bezüglich der Datenherkunft.When retrieving data from a database for use in R code, you should always eliminate columns that cannot be used in R, as well as columns that are not useful for analysis, such as GUIDS (uniqueidentifier), timestamps and other columns used for auditing, or lineage information created by ETL processes.

Beachten Sie, dass die Leistung von R-Code durch unnötige Spalten deutlich beeinträchtigt werden kann, besonders dann, wenn Spalten mit hoher Kardinalität als Faktoren verwendet werden.Note that inclusion of unnecessary columns can greatly reduce the performance of R code, especially if high cardinality columns are used as factors. Aus diesem Grund wird empfohlen, im System gespeicherte Prozeduren von SQL Server und Informationsansichten zu verwenden, um die Datentypen für eine angegebene Tabelle im Voraus abzurufen und inkompatible Spalten entweder zu löschen oder zu konvertieren.Therefore, we recommend that you use SQL Server system stored procedures and information views to get the data types for a given table in advance, and eliminate or convert incompatible columns. Weitere Informationen finden Sie unter Information Schema Views in Transact-SQL (Ansichten des Informationsschemas in Transact-SQL)For more information, see Information Schema Views in Transact-SQL

Falls ein bestimmter SQL ServerSQL Server-Datentyp in R nicht unterstützt wird, Sie aber die Datenspalten im R-Skript verwenden müssen, empfehlen wir Ihnen, die Funktionen „Cast“ und „Convert“ (Transact-SQL) zu verwenden, um sicherzustellen, dass die Datentypenkonvertierungen wie gewünscht ausgeführt werden, bevor Sie die Daten in Ihrem R-Skript verwenden.If a particular SQL ServerSQL Server data type is not supported by R, but you need to use the columns of data in the R script, we recommend that you use the CAST and CONVERT (Transact-SQL) functions to ensure that the data type conversions are performed as intended before using the data in your R script.

Warnung

Wenn Sie rxDataStep verwenden, um inkompatible Spalten beim Verschieben von Daten fallen zu lassen, denken Sie daran, dass die Argumente varsToKeep und varsToDrop für den Datenquelltyp RxSqlServerData nicht unterstützt werden.If you use the rxDataStep to drop incompatible columns while moving data, be aware that the arguments varsToKeep and varsToDrop are not supported for the RxSqlServerData data source type.

BeispieleExamples

Beispiel 1: Implizite KonvertierungExample 1: Implicit conversion

In folgendem Beispiel wird veranschaulicht, wie Daten auf dem Weg zwischen SQL Server und R umgewandelt werden.The following example demonstrates how data is transformed when making the round-trip between SQL Server and R.

Die Abfrage ruft eine Reihe von Werten aus einer SQL ServerSQL Server-Tabelle ab und verwendet die gespeicherte Prozedur sp_execute_external_script, um die Werte mithilfe der R-Runtime auszugeben.The query gets a series of values from a SQL ServerSQL Server table, and uses the stored procedure sp_execute_external_script to output the values using the R runtime.

CREATE TABLE MyTable (    
 c1 int,    
 c2 varchar(10),    
 c3 uniqueidentifier    
);    
go    
INSERT MyTable VALUES(1, 'Hello', newid());    
INSERT MyTable VALUES(-11, 'world', newid());    
SELECT * FROM MyTable;    
  
EXECUTE sp_execute_external_script    
 @language = N'R'    
 , @script = N'    
inputDataSet["cR"] <- c(4, 2)    
str(inputDataSet)    
outputDataSet <- inputDataSet'    
 , @input_data_1 = N'SELECT c1, c2, c3 FROM MyTable'    
 , @input_data_1_name = N'inputDataSet'    
 , @output_data_1_name = N'outputDataSet'    
 WITH RESULT SETS((C1 int, C2 varchar(max), C3 varchar(max), C4 float));  

ErgebnisseResults

Zeile #Row # C1C1 C2C2 C3C3 C4C4
11 11 HalloHello 6e225611-4b58-4995-a0a5-554d19012ef16e225611-4b58-4995-a0a5-554d19012ef1 44
22 -11-11 worldworld 6732ea46-2d5d-430b-8ao1-86e7f3351c3e6732ea46-2d5d-430b-8ao1-86e7f3351c3e 22

Beachten Sie die Verwendung der str -Funktion in R, um das Schema der Ausgabedaten zu erhalten.Note the use of the str function in R to get the schema of the output data. Diese Funktion gibt die folgenden Informationen zurück:This function returns the following information:

'data.frame':2 obs. of  4 variables:
 $ c1: int  1 -11
 $ c2: Factor w/ 2 levels "Hello","world": 1 2
 $ c3: Factor w/ 2 levels "6732EA46-2D5D-430B-8A01-86E7F3351C3E",..: 2 1
 $ cR: num  4 2

Daraus können Sie erkennen, dass die folgenden Datentypenkonvertierungen implizit als Teil der Abfrage durchgeführt wurden:From this, you can see that the following data type conversions were implicitly performed as part of this query:

  • Spalte C1.Column C1. Die Spalte wird in ssNoversion als SQL ServerSQL Server, in R als integer und im Ausgaberesultset als ssNoversion dargestellt.The column is represented as int in SQL ServerSQL Server, integer in R, and int in the output result set.

    Es wurde keine Typenkonvertierung durchgeführt.No type conversion was performed.

  • Spalte C2.Column C2. Die Spalte wird in ssNoversion als SQL ServerSQL Server, in R als factor und im Ausgaberesultset als varchar(max) dargestellt.The column is represented as varchar(10) in SQL ServerSQL Server, factor in R, and varchar(max) in the output.

    Beachten Sie, wie sich die Ausgabe ändert; jede Zeichenfolge von R (entweder ein Faktor oder eine reguläre Zeichenfolge) wird als varchar(max) dargestellt, unabhängig von der Länge der Zeichenfolge.Note how the output changes; any string from R (either a factor or a regular string) will be represented as varchar(max), no matter what the length of the strings is.

  • Spalte C3.Column C3. Die Spalte wird in ssNoversion als SQL ServerSQL Server, in R als character und im Ausgaberesultset als varchar(max) dargestellt.The column is represented as uniqueidentifier in SQL ServerSQL Server, character in R, and varchar(max) in the output.

    Beachten Sie die ausgeführte Datentypenkonvertierung.Note the data type conversion that happens. SQL ServerSQL Server unterstützt den ssNoversion , R jedoch nicht; daher werden die Bezeichner als Zeichenfolgen dargestellt.supports the uniqueidentifier but R does not; therefore, the identifiers are represented as strings.

  • Spalte C4.Column C4. Die Spalte enthält Werte, die vom R-Skript generiert wurden und die in den ursprünglichen Daten nicht vorhanden waren.The column contains values generated by the R script and not present in the original data.

Beispiel 2: Dynamische Spaltenauswahl mithilfe von RExample 2: Dynamic column selection using R

Im folgenden Beispiel wird veranschaulicht, wie Sie R-Code zum Prüfen auf ungültige Spaltentypen verwenden können.The following example shows how you can use R code to check for invalid column types. Der R-Code ruft das Schema der angegebenen Tabelle mithilfe der Systemsichten von SQL Server ab und entfernt alle Spalten, die einen angegebenen ungültigen Typen aufweisen.The gets the schema of a specified table using the SQL Server system views, and removes any columns that have a specified invalid type.

connStr <- "Server=.;Database=TestDB;Trusted_Connection=Yes"
data <- RxSqlServerData(connectionString = connStr, sqlQuery = "SELECT COLUMN_NAME FROM TestDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'testdata' AND DATA_TYPE <> 'image';")
columns <- rxImport(data)
columnList <- do.call(paste, c(as.list(columns$COLUMN_NAME), sep = ","))
sqlQuery <- paste("SELECT", columnList, "FROM testdata")

Weitere InformationenSee also