SQL Server:在包含连接的where子句中使用LEN或变量

时间:2017-12-22 01:05:07

标签: sql sql-server-2012

我创建了一个地图表,用于在大量唯一主机名列表中查找各种唯一字符串。

如果我输入各种长度,即varchar(2)varchar(11)等,则初始代码有效。它试图引用变量长度是我的问题开始的地方。

在尝试使用变量之前,我尝试了几种不同的组合。

例如在where子句中,用varchar(2)替换m.[HostNameAlias_IDLength]

我也很难使用变量。

任何想法都会非常感激。

TM

P.S。下面列出了代码和示例表的列表。

表1

  • HostNameAlias_id(pk,varchar(5),not null)
  • ProjectName_ID(int,not null)
  • HostnameAlias_IDLength(computed,int,null)

数据

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

表2

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

示例数据:

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

查询

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 个答案:

答案 0 :(得分:1)

在用于发现该长度的where子句中无法知道结果的长度,因此我不明白为什么要尝试这个。此外,[主机名]列是一个varchar(16),因此您最多可以遇到16个字符,因此只需使用该最大值...如果完全需要转换。

下面我刚刚使用LIKE而不是IN,也许这会有所帮助。

SQL Fiddle

MS SQL Server 2014架构设置

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)
;

查询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]包括列名中的空格是一个可以而且应该避免的复杂因素,因此我使用了[HostName]