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 dasmax
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 nichtSET 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.