Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

LEFT() vs. SET TEXTSIZE in SQL Server:Was ist der Unterschied?

Sie kennen vielleicht den SET TEXTSIZE -Anweisung in SQL Server, mit der Sie die in einem SELECT zurückgegebene Datenmenge begrenzen können Abfrage.

Vielleicht stellen Sie fest, dass die Ergebnisse genau die gleichen sind wie LEFT() beim Ausführen einer bestimmten Abfrage. Was die Frage aufwirft:Gibt es einen Unterschied zwischen diesen beiden Optionen?

Es gibt definitiv Unterschiede zwischen diesen beiden Optionen. Es gibt Fälle, in denen beide Funktionen völlig unterschiedliche Ergebnisse liefern. Und es gibt auch Unterschiede in ihrer Funktionsweise sowie in der Art der Daten, für die sie verwendet werden können.

Definitionen

Beginnen wir damit, uns anzusehen, was jeder einzelne tut.

LEFT()
Gibt den linken Teil einer Zeichenfolge mit der angegebenen Anzahl von Zeichen zurück.
SET TEXTSIZE
Gibt die Größe von varchar(max) an , nvarchar(max) , varbinary(max) , Text , ntext und Bild Daten, die von einem SELECT zurückgegeben werden Erklärung.

Sehen wir uns das genauer an.

Zeichen vs. Datengröße

Achten Sie auf den Wortlaut jeder Definition. Insbesondere die Wörter „Zeichen“ vs. „Größe“ und „Daten“.

  • LEFT() können Sie explizit angeben, wie viele Zeichen zurückgegeben werden.
  • SET TEXTSIZE ermöglicht es Ihnen, die Größe festzulegen der zurückgegebenen Daten.

Dies ist eine wichtige Unterscheidung, da Sie je nach Datentyp unterschiedliche Ergebnisse erhalten. Unterschiedliche Charaktere können unterschiedliche Speichergrößen erfordern. Ein Zeichen kann 1 Byte und ein anderes 2 Bytes verwenden.

Mit LEFT() ermöglicht es Ihnen, die Anzahl der Zeichen anzugeben, unabhängig davon, wie viele Bytes sie verwenden.

SET TEXTSIZE andererseits können Sie die Anzahl der Bytes angeben zurückkehren – nicht die Nummernzeichen.

Wenn die Daten mit nvarchar(max) gespeichert werden Beispielsweise könnten Sie feststellen, dass SET TEXTSIZE gibt die Hälfte der Zeichen zurück, die LEFT() tut.

Beispiel:

CREATE TABLE TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );SET TEXTSIZE 50;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest; SET TEXTSIZE 4;SELECT * FROM TextSizeTest;

Ergebnis:

+-------------+-------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Ziehen Sie | Ziehen Sie | Ziehen |+-------------+-------------+---------------+(1 Zeile betroffen)Befehle erfolgreich abgeschlossen.+------------+--------------+------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Drachenfrucht | Ziehen Sie | Dr. |+-------------+-------------+---------------+(1 Zeile betroffen)

Das erste Ergebnis ist für LEFT() . Es funktioniert über alle drei Datentypen und -größen hinweg. Es gibt die genaue Anzahl der angegebenen Zeichen zurück.

Das zweite Ergebnis ist für SET TEXTSIZE . Es wirkt sich nicht auf varchar(50) aus Ergebnisse. Es betrifft nur die anderen beiden. Aber es betrifft sie anders. Für varchar(max) verwendet jedes Zeichen 1 Byte, und wir erhalten dieselbe Anzahl von Zeichen zurück, die der angegebenen TEXTSIZE entspricht . Für nvarchar(max) es ist eine andere Geschichte. Jedes Zeichen verwendet 2 Bytes, daher erhalten wir nur die Hälfte der zurückgegebenen Zeichen.

Die Ergebnisse werden jedoch von LEFT() zurückgegeben könnte möglicherweise noch von SET TEXTSIZE beeinflusst werden . Wenn ich LEFT() ausführe erneut abfragen, aber voranstellen mit SET TEXTSIZE 2 , erhalten wir Folgendes:

SET TEXTSIZE 2;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;

Ergebnis:

+-------------+-------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+-------------+---------------|| Ziehen Sie | Dr. | D |+-------------+--------------+---------------+ 

Maximale Datengröße vs. feste Datengröße

Ein weiterer Unterschied ist das SET TEXTSIZE funktioniert nur auf varchar(max) , nvarchar(max) , varbinary(max) , Text , ntext und Bild Daten. Beachten Sie das max Teil. Wenn Sie eine feste Datengröße verwenden (z. B. varchar(255) zum Beispiel), SET TEXTSIZE funktioniert nicht.

LEFT() hingegen funktioniert mit allen Zeichendaten außer text und ntext .

Sie können diese Unterschiede im vorherigen Beispiel sehen. Der varchar(50) Daten wurden von LEFT() beeinflusst aber nicht SET TEXTSIZE .

LEFT() ist spezifischer

Ein weiterer Unterschied besteht darin, dass LEFT() wird nur auf die von Ihnen angegebene Spalte (oder Konstante oder Variable) angewendet. Wenn Sie es auf mehrere Spalten/Ausdrücke anwenden möchten, müssen Sie es für jeden Ausdruck erneut einschließen. Gleiches gilt für nachfolgende Abfragen.

SET TEXTSIZE wird andererseits auf alle zutreffenden Spalten angewendet, die in der Abfrage zurückgegeben werden. Es wird auch auf alle Abfragen angewendet, bis es auf einen anderen Wert gesetzt wird.