[英]How to retrieve a column name from a table that is stored as a value in another table
[英]How to select from table which name is stored in a column with “0,” prefix in another table
我需要能夠從一個表中選擇所有內容,該表的名稱存儲在某些表中帶有“ 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”不允許我這樣做。 另一件事是,並非“參數”列中的每個值都是表名。
有沒有一種方法可以在此查詢中使用“參數”列而不是“ 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
謂詞來將參數與表名進行匹配,因此agrtid = @agrtid
使用agrtid LIKE '%' + @agrtid + '%'
代替agrtid = @agrtid
:
...
FROM (
SELECT DISTINCT wf_table_name FROM awftrans WHERE agrtid LIKE '%' + @agrtid + '%'
) t
...
以上查詢僅正確。 但是,代替Quotename函數,使用填充函數“ stuff(wf_table_name,1,2,'')”刪除前兩個字符,這將為您提供表名,並且在if條件下,使用9而不是11作為聯合長度,則全部為僅9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.