2017-12-22 1 views
1

Ich habe eine Zuordnungstabelle erstellt, um verschiedene eindeutige Zeichenfolgen innerhalb einer großen Liste eindeutiger Hostnamen zu finden.SQL Server: Verwenden eines LEN oder einer Variablen in where-Klausel, die eine Verknüpfung enthält

Der erste Code funktioniert, wenn ich die verschiedenen Längen eingeben, d. H. varchar(2), varchar(11), usw. Es versucht, die variablen Längen beziehen, wo meine Probleme begann.

Ich habe verschiedene Kombinationen ausprobiert, bevor ich versuche, eine Variable zu verwenden.

Zum Beispiel in der where-Klausel, Substitution der varchar(2) mit dem m.[HostNameAlias_IDLength]

ich auch Schwierigkeiten mit Variablen, die ich.

Alle Gedanken würden sehr geschätzt werden.

TM

P.S. Eine Auflistung der Code- und Beispieltabellen ist unten aufgeführt.

Tabelle1

  • HostNameAlias_id (pk, VARCHAR (5), nicht null)
  • ProjectName_ID (int, nicht null)
  • HostnameAlias_IDLength (berechnet, int, null)

Daten

HostNameAlias_ID ProjectName_ID HostNameAlias_IDLength 
---------------------------------------------------------- 
H123456789023456   16009 16 
B123456789023    16005 13 
C1234567890     16009 11 
d12345678     16009 9 
e123456      16009 8 
f12345      16003 6 
g1234      16035 5 
h123      16035 4 
j12       16005 3 
k1       16007 2 

Table2

  • [host name] (pk, nvarchar (50), nicht null
  • Projectname_id (int, nicht null)

Probendaten:

Host name   Title   projectname_ID 
-------------------------------------------------- 
C1234567890a1  vp     16009 
C1234567890a2  avp     16009 
h12335    student    16009 
h12356    teacher    16009 
h12357    prof    16009 

Abfrage

DECLARE @len = INT() 
DECLARE @slen = VARCHAR(2); 

SELECT DISTINCT 
    @len = m.[HostNameAlias_IDLength], 
    @slen = CONVERT(varchar(2), m.[HostNameAlias_ID]), 
    c.[Host Name], 
    m.[projectname_id] 
FROM 
    [table1] c 
JOIN 
    [table2] m ON c.[projectname_id] = m.[projectname_id] 
WHERE 
    CONVERT(varchar(2), [Host Name]) IN (SELECT [HostNameAlias_ID] 
             FROM [table2]) 
+1

Warum sind Sie besorgt über die Länge eines Varchar? es hat eine variable Länge ... den Punkt dieser Komplexität nicht zu sehen. Wenn Sie daran festhalten, denke ich, dass Sie dynamic sql benötigen, um eine Länge in die Varchar-Konvertierung zu ersetzen. –

+0

Bitte ["* ​​Klicken Sie auf ein Häkchen *"] (https://ibb.co/ikqyO6), um eine Antwort zu akzeptieren, entweder weil Sie Ihr Problem gelöst haben oder am hilfreichsten war, um Ihre Lösung zu finden. Zum Rückgängigmachen klicken). ** Die Annahme einer Antwort zeigt, dass die Frage gelöst ist und dass ** anderen Zeit spart **, wenn nach Lösungen gesucht wird oder nach zu lösenden Fragen gesucht wird. * ps: du bekommst 2 Rufpunkte, wenn du eine Antwort akzeptierst * –

Antwort

1

Die Länge eines Ergebnisses kann in der where-Klausel, die zum Auffinden dieser Länge verwendet wird, nicht bekannt sein. Daher verstehe ich nicht, warum Sie dies versuchen. Darüber hinaus ist die Spalte [Hostname] ein varchar (16), so dass Sie bis zu 16 Zeichen finden können, verwenden Sie also das Maximum ... wenn die Konvertierung überhaupt benötigt wird.

Unten habe ich nur LIKE anstelle von IN verwendet, vielleicht wird das helfen.

SQL Fiddle

MS SQL Server 2014-Schema-Setup:

CREATE TABLE Table1 
    ([HostNameAlias_ID] varchar(16), [ProjectName_ID] int, [HostNameAlias_IDLength] int) 
; 

INSERT INTO Table1 
    ([HostNameAlias_ID], [ProjectName_ID], [HostNameAlias_IDLength]) 
VALUES 
    ('H123456789023456', 16009, 16), 
    ('B123456789023', 16005, 13), 
    ('C1234567890', 16009, 11), 
    ('d12345678', 16009, 9), 
    ('e123456', 16009, 8), 
    ('f12345', 16003, 6), 
    ('g1234', 16035, 5), 
    ('h123', 16035, 4), 
    ('j12', 16005, 3), 
    ('k1', 16007, 2) 
; 


CREATE TABLE Table2 
    ([HostName] varchar(13), [Title] varchar(7), [projectname_ID] int) 
; 

INSERT INTO Table2 
    ([HostName], [Title], [projectname_ID]) 
VALUES 
    ('C1234567890a1', 'vp', 16009), 
    ('C1234567890a2', 'avp', 16009), 
    ('h12335', 'student', 16009), 
    ('h12356', 'teacher', 16009), 
    ('h12357', 'prof', 16009) 
; 

Abfrage 1:

SELECT 
     m.[HostName] 
    , c.[HostNameAlias_ID] 
    , m.[projectname_id] 
    , c.[HostNameAlias_IDLength] 
FROM [table1] c 
JOIN [table2] m ON c.[projectname_id] = m.[projectname_id] 
WHERE [HostName] LIKE ([HostNameAlias_ID] + '%') 

Results:

|  HostName | HostNameAlias_ID | projectname_id | HostNameAlias_IDLength | 
|---------------|------------------|----------------|------------------------| 
| C1234567890a1 |  C1234567890 |   16009 |      11 | 
| C1234567890a2 |  C1234567890 |   16009 |      11 | 

re: [Host name] inklusive Leerzeichen in Spaltennamen ist eine Komplikation, die kann und sollte vermieden werden, so habe ich [HostName] stattdessen verwendet.

+0

Vielen Dank, es funktioniert perfekt. – TMilzSr

+0

Gute Nachrichten. Wissen Sie über das Akzeptieren einer Antwort? Um "[** Klicken Sie auf das Häkchen **] (https://ibb.co/ikqyO6)" zu akzeptieren, klicken Sie auf [help/accepting] (https://stackoverflow.com/help/someone-answers) –

Verwandte Themen