如何从表中选择哪个名称存储在" 0,"列中?另一个表中的前缀

时间:2017-09-18 10:33:59

标签: sql sql-server select

我需要能够从一个表中选择所有名称,该表存储在某个表中的列中,并带有" 0,"前缀。

我有一张桌子,其中有一个"参数"存储一些不同数据的列。其中一些数据是带有" 0,"的临时表名。字首。例如" 0,awfhe"并且只有" awfhe"是表名。 (左侧总是只有2个字符)。 但并非"论证中的每一个价值#34; column是表名。

我写了一个这样的查询:

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

我想使用存储在&#34; argumen&#34; t列中的表而不是&#34; wf_table_name&#34;但是&#34; 0,&#34;前缀不允许我这样做。 另一件事是,&#34;论证&#34; column是表名。

有没有办法可以使用&#34;论证&#34;列而不是&#34; wf_table_name&#34;在这个查询?

//编辑:  更准确地说,我想到了这样的事情:

  (...)
  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'.

我需要摆脱&#39; 0,&#39;在这个sql语句中以某种方式输入前缀。

2 个答案:

答案 0 :(得分:0)

您可以使用LIKE谓词将参数与表名匹配,而不是agrtid = @agrtid使用agrtid LIKE '%' + @agrtid + '%'

...
FROM (
SELECT DISTINCT wf_table_name FROM awftrans WHERE agrtid LIKE '%' + @agrtid + '%'
) t
...

答案 1 :(得分:0)

以上查询仅供参考。 但是,而不是Quotename函数使用东西函数&#34; stuff(wf_table_name,1,2,&#39;&#39;)&#34;删除将给出表名的前2个字符,并在if条件中使用9而不是11作为union的长度all仅为9