如何从表中选择哪个名称存储在另一个表中带有“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”前缀的列中的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

在检查行是不是已存在时,选择不会从表中获取任何内容

如何加入名称作为值存储在另一个表中的表?

SQL语句

从表中删除记录,如果其特定值未出现在另一个表中

从表中选择数据并从另一个表中填充特定值