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

问题描述 投票:1回答:1

我创建了一个映射表,以在大量唯一主机名中查找各种唯一字符串。

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

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

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

我也很难使用变量。

任何想法将不胜感激。

TM值

附:下面列出了代码和示例表的列表。

表格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])
sql sql-server-2012
1个回答
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]

© www.soinside.com 2019 - 2024. All rights reserved.