如何从表中选择哪个名称存储在另一个表中带有“0”前缀的列中
Posted
技术标签:
【中文标题】如何从表中选择哪个名称存储在另一个表中带有“0”前缀的列中【英文标题】:How to select from table which name is stored in a column with "0," prefix in another table 【发布时间】:2017-09-18 10:33:58 【问题描述】:我需要能够从一个表中选择所有内容,该表的名称存储在某个带有“0”前缀的表的列中。
我有一个表,其中有一个“参数”列,用于存储一些不同的数据。其中一些数据是带有“0”前缀的临时表名。例如“0,awfhe”,只有“awfhe”是表名。 (左侧总是只有 2 个字符)。 但并非“参数”列中的每个值都是表名。
我写了一个这样的查询:
DECLARE @agrtid INT = 0
WHILE(@AGRTID<10)
BEGIN
SET @agrtid = @agrtid+1;
DECLARE @sql NVARCHAR(MAX) = ''
IF EXISTS (Select agrtid from awftrans)
SELECT @sql = @sql +
'SELECT
*
FROM awftrans A
JOIN ' + QUOTENAME(wf_table_name) + ' B
ON A.wf_group = B.wf_group
where A.wf_group IS NOT NULL
UNION ALL
'
FROM (
SELECT DISTINCT wf_table_name FROM awftrans WHERE agrtid = @agrtid
) t
IF @sql <> '' BEGIN
-- Remove the last UNION ALL
SELECT @sql = LEFT(@sql, LEN(@sql) - 11)
PRINT @sql
EXEC sp_executesql
@sql,
N'@agrtid INT',
@agrtid
END
END
我想使用存储在“argumen”t 列中的表而不是“wf_table_name”,但是“0”前缀不允许我这样做。 另一件事是,并非“参数”列中的每个值都是表名。
有没有办法在这个查询中使用“argument”列而不是“wf_table_name”?
//编辑: 更准确地说,我想到了这样的事情:
(...)
FROM awftrans A
JOIN ' + QUOTENAME(RIGHT(argument)-2) + ' B
ON A.wf_group = B.wf_group
where A.wf_group IS NOT NULL
UNION ALL
'
FROM (
SELECT DISTINCT (RIGHT(argument)-2) FROM awftrans WHERE agrtid = @agrtid
) t
(...)
//EDIT2:
问题是,当我编写这样的查询时:
DECLARE @agrtid INT = 0
WHILE(@AGRTID<10)
BEGIN
SET @agrtid = @agrtid+1;
DECLARE @sql NVARCHAR(MAX) = ''
IF EXISTS (Select agrtid from awftrans)
SELECT @sql = @sql +
'SELECT
*
FROM awftrans A
JOIN ' + QUOTENAME(argument) + ' B
ON A.wf_group = B.wf_group
where A.wf_group IS NOT NULL
UNION ALL
'
FROM (
SELECT DISTINCT argument FROM awftrans WHERE agrtid = @agrtid
) t
IF @sql <> '' BEGIN
-- Remove the last UNION ALL
SELECT @sql = LEFT(@sql, LEN(@sql) - 11)
PRINT @sql
EXEC sp_executesql
@sql,
N'@agrtid INT',
@agrtid
END
END
我收到这样的消息:
SELECT
*
FROM awftrans A
JOIN [0,awfhe] B
ON A.wf_group = B.wf_group
where A.wf_group IS NOT NULL
Msg 208, Level 16, State 1, Line 1
Invalid object name '0,awfhe'.
而且我需要在这个 sql 语句中以某种方式去掉“0”前缀。
【问题讨论】:
您可以使用like
比较,因此您可以使用 `like '0%' 返回以 0 开头的所有内容
"wf_table_name" 和 awftrans 表中的"argument"。它们都存储有表名。我为“wf_table_name”列编写了上面的查询,但看起来我也需要它用于“argument”列。问题是“argument”列中的表名总是有“0”前缀,例如“0,awfhe”而不是“awfhe”——正确的表名。
【参考方案1】:
您可以使用LIKE
谓词将参数与表名匹配,因此请使用agrtid LIKE '%' + @agrtid + '%'
代替agrtid = @agrtid
:
...
FROM (
SELECT DISTINCT wf_table_name FROM awftrans WHERE agrtid LIKE '%' + @agrtid + '%'
) t
...
【讨论】:
感谢您的回答,但这不是我的意思。我将问题编辑得更准确。 @KSiuda 我还是不明白,请你提供一些参数和表名的示例。 "wf_table_name" 和 awftrans 表中的"argument"。它们都存储有表名。我为“wf_table_name”列编写了上面的查询,但看起来我也需要它用于“argument”列。问题是“argument”列中的表名总是有“0”前缀,例如“0,awfhe”而不是“awfhe”——正确的表名。【参考方案2】:上述查询仅是正确的。 但是代替 Quotename 函数使用 stuff function"stuff(wf_table_name,1,2,'')" 删除前 2 个字符,这将为您提供表名,并且在 if 条件中使用 9 而不是 11 作为联合长度仅 9 个
【讨论】:
您好,谢谢您的回答。你能看看编辑过的问题吗? "wf_table_name" 和 awftrans 表中的"argument"。它们都存储有表名。我为“wf_table_name”列编写了上面的查询,但看起来我也需要它用于“argument”列。问题是“argument”列中的表名总是有“0”前缀,例如“0,awfhe”而不是“awfhe”——正确的表名。以上是关于如何从表中选择哪个名称存储在另一个表中带有“0”前缀的列中的主要内容,如果未能解决你的问题,请参考以下文章