我需要能够从一个表中选择所有名称,该表存储在某个表中的列中,并带有" 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语句中以某种方式输入前缀。
答案 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