【发布时间】:2023-03-24 16:05:02
【问题描述】:
我需要能够从一个表中选择所有内容,该表的名称存储在某个带有“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”——正确的表名。
标签: sql sql-server select