我创建了一个地图表,用于在大量唯一主机名列表中查找各种唯一字符串。
如果我输入各种长度,即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])
答案 0 :(得分:1)
在用于发现该长度的where子句中无法知道结果的长度,因此我不明白为什么要尝试这个。此外,[主机名]列是一个varchar(16),因此您最多可以遇到16个字符,因此只需使用该最大值...如果完全需要转换。
下面我刚刚使用LIKE而不是IN,也许这会有所帮助。
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]
。