2017-01-10 4 views
1

Ich schreibe eine gespeicherte Prozedur und ich muss eine SQL Server-Variable mit einer Spalte vergleichen. Das Problem ist, dass wenn meine SQL-Variable ein VARCHAR ist, der nicht die gleiche Länge wie der Spaltentyp hat, wird es nicht übereinstimmen.Vergleichen von VARCHARs unterschiedlicher Länge

Beispiel:
Lassen Sie uns sagen, ich habe eine Tabelle types mit einer Spalte name, die einen Typ VARCHAR(100) hat. den Code ausführen, werden mir keine Ergebnisse geben:

DECLARE @type VARCHAR(100); 
SET @type = 'My Type Name'; 
select * from types where name = @type 

Nun, ich möchte in der Lage sein, es zu tun, die erste:

DECLARE @type VARCHAR(20); 
SET @type = 'My Type Name'; 
select * from types where name = @type 

jedoch diese Abfrage ausgeführt wird meine Spalte finden Übrigens, wenn ich die Spalte modifiziere, möchte ich nicht, dass diese Abfrage fehlschlägt. Kann mir jemand sagen, was ich falsch mache?

Edit:

Hier ist meine Spalte Schema:

My Schema

Abfrage:

DECLARE @event_type VARCHAR(20); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

Ausgang:

First output

Abfrage:

DECLARE @event_type VARCHAR(100); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

Ausgang:

Second output

+0

Können Sie einige Beispieldaten gemeinsam nutzen, wo Sie in diesem Fall finden? ''My Type Name' 'in einer Zeichenfolge der Länge 20 entspricht" My Type Name "in einer Zeichenfolge der Länge 100.Wenn Sie versuchen, eine Variable der Länge 20 auf einen Wert mit einer größeren Länge zu setzen, wird sie abgeschnitten, und Sie erhalten möglicherweise unerwartete Ergebnisse. – HoneyBadger

+1

Wenn die Eingabe "Mein Typname" mehr als 20 Zeichen enthält, schlägt die erste fehl. Die Eingabe wird auf 20 Zeichen gekürzt und mit name überprüft. Es wird keine Ausnahme oder Warnung werfen –

+0

Aktualisiert die Frage mit Beispielen. – snyderxc

Antwort

1

Im Folgenden wird sich verhalten, wie Sie beschrieben:

CREATE TABLE #types 
(
    type VARCHAR(100) 
) 

INSERT INTO #types (type) VALUES ('My Type Name') 

-- returns 1 row 
select * from #types 

-- returns 0 rows 
DECLARE @type VARCHAR(10); 
SET @type = 'My Type Name'; 
select * from #types where type = @type 

-- returns 1 row 
DECLARE @long_type VARCHAR(100); 
SET @long_type= 'My Type Name'; 
select * from #types where type = @long_type 

drop table #types 

Der Punkt ist, dass DECLARE @type VARCHAR(10); SET @type = 'My Type Name'; gesetzt tatsächlich Ihre Variable 'My Type Na' (Länge = 10).

Wenn Ihr Wert also länger ist als Ihre Variable, wird die Variable auf den abgeschnittenen Wert gesetzt. Keine Warnung, kein Fehler. Wenn Sie dann versuchen, es mit dem ursprünglichen (längeren) Wert gleichzusetzen, werden Sie feststellen, dass sie nicht gleich sind.

+0

Das war genau das Problem. Ich habe eine Zeichenfolge länger als 20 Zeichen verwendet und sie wurde abgeschnitten. Danke vielmals! Ich wünschte auch wirklich, dass SQL Server Sie warnen würde, aber gut. – snyderxc

0

hier ist das, was ich select * from events.types tun würde, wo ltrim (rtrim (Name)) = @Ereignistyp

1

Ihre editierten Beispiel:

DECLARE @event_type VARCHAR(20); 
SET @event_type = 'Price Increase Notification'; 
select * from events.types where name = @event_type 

Die Zeichenfolge Sie @Ereignistyp Einstellung werden Um 27 Zeichen zu erhalten, wird es auf 20 Zeichen gekürzt und daher gibt es keine Übereinstimmung.

Was würde ich wahrscheinlich gewährleisten tun, wenn die Spaltenlänge ändert Sie sind in Ordnung ist @Ereignistyp als varchar (max) erklären

Verwandte Themen