2017-07-06 127 views
0

我想要選擇所有具有相同列的表,並且該列中有一個實例與我指定的字符串格式匹配。當該列包含特定值時,如何從具有特定命名列的表中進行選擇?

例如,

表1:

名字,姓氏,ID

表2:

ID,價值

表3:

姓,價值

我希望我的結果表明,包含ID的表中的ID以字符開始「A」

到目前爲止,我有什麼是

SELECT SYS.TABLES.NAME FROM SYS.TABLES 
    INNER JOIN SYS.COLUMNS 
    ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID 
    WHERE SYS.COLUMS.NAME = 'ID' 

但當時我不知道如何繼續。任何幫助表示讚賞:)

+0

你可能想看看這個SO後 - [?如何設置動態SQL查詢的表名(https://stackoverflow.com/questions/20678725/how-to-set-table -name-in-dynamic-sql-query) –

+0

這可能是你正在尋找的第二個難題[查詢結果中的T-SQL循環](https://stackoverflow.com/questions/11852782/t-sql-循環查詢結果)以防萬一您不熟悉它。我想你可以把它放在一起。 –

+0

爲什麼在您的示例中包含Table3,它缺少您定位的列(ID)? –

回答

1

此代碼測試,它的工作原理:

創建一個選擇所有的表/列名的光標所在列= ID(我們不需要列變量,因爲您只針對'ID',但是我包含它以防您或其他人需要更多功能)。

一旦你存儲了這些信息,你就可以遍歷遊標並執行動態SQL。請注意,這對SQL注入很敏感,幾乎所有動態SQL都是如此。

此方法將爲每個具有列ID的表提供單獨的數據表 - 即使沒有符合條件的ID列(您將只爲這些表獲得空白數據表)。

此外,您可以根據需要更改變量的大小。

如果您需要任何澄清或修改,請讓我知道。

DECLARE @TableName varchar(255), @ColumnName varchar(255), @SQL varchar(1000) 

DECLARE TempCursor CURSOR FOR 
SELECT T.[name] AS [TableName], C.[name] AS [ColumnName] 
FROM sys.tables T 
JOIN sys.columns C 
    ON T.object_id = C.object_id 
WHERE C.[name] = 'ID' 


OPEN TempCursor 
FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName 
WHILE @@FETCH_STATUS = 0 
    BEGIN  

     SET @SQL = 'SELECT * FROM ' + @TableName 
     SET @SQL = @SQL + ' WHERE ' + @ColumnName + ' like ''a%''' 
     EXECUTE (@SQL) 

     FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName 

    END 

CLOSE TempCursor 
DEALLOCATE TempCursor 
+0

開始的記錄!謝謝你斯坦! – swordgit

+0

@swordgit沒問題 - 它承擔了我幾次嘗試,但我們到了那裏! –

+0

@swordgit另外,您不必爲我做這件事,但在將來,您應該提出任何有助於您的問題,以便將來遇到類似問題的用戶可以快速找到最佳答案。 –

0

您可以使用「喜歡」,選擇一次以「」開頭的:

SELECT SYS.TABLES.NAME AS t 
FROM SYS.TABLES INNER JOIN SYS.COLUMNS 
ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID 
WHERE SYS.COLUMNS.NAME = 'ID' AND EXISTS (SELECT * FROM t WHERE t.ID LIKE 'a%'); 

符號「%」表示任意字符的組合可以是字母「之後存在一個「

+1

SYS.COLUMNS.NAME只引用列的名稱,但不包含列所包含的值,所以它不起作用,我正在查找包含從字母a開始的值的列 – swordgit

+1

恐怕這是不是OP要求的。如果我理解正確,他希望列ID爲記錄的所有表格以'a'開頭。某種類似DB的廣告。 –

+0

對不起,我誤解了你的問題@swordgit,你可以發佈類似於你的名字的代碼嗎?這會幫助我更好地理解 –

0

我仍然不知道我是否正確地得到了你的問題 - 但讓我們試試吧!

使用以下查詢來獲取所有的表與列ID

SELECT SYS.TABLES.NAME , SYS.COLUMNS.NAME 
FROM SYS.TABLES INNER JOIN SYS.COLUMNS 
ON SYS.TABLES.OBJECT_ID = SYS.COLUMNS.OBJECT_ID 
WHERE SYS.COLUMNS.NAME = 'ID'; 

你將不得不通過表名迭代(想想cursorwhile等)

在循環內部,嘗試一些這樣

declare @resultcount int; 
declare @QueryMain as nvarchar(4000) 
set @QueryMain = N'SELECT * FROM <TABLE_NAME> WHERE ID LIKE ''a%''' 
exec sp_executesql @QueryMain 
set @resultcount = @@rowcount; 

檢查的@resultcount值,看看是否CURREN t表名稱有資格並使用類似臨時表的東西來收集它。

你可能會使用其他選項sp_executesql調整這個查詢

相關問題