2
所以,我想弄清楚(如果可能的話)如何返回只有2列的結果集,這些列的行數與給定表中的列數成正比名稱,而不使用動態SQL函數:exec。根據sys.columns中返回的值構建SELECT語句
Ex。我有表 'TBLA':
CREATE TABLE [dbo].[tblA](
[ColumnA] [varchar](20) NOT NULL,
[ColumnB] [varchar](20) NOT NULL,
[ColumnC] [varchar](20) NOT NULL
)
我甲肝TBLB
CREATE TABLE [dbo].[tblB](
[Column1] [varchar](20) NOT NULL,
[Column2] [varchar](20) NOT NULL
)
我可以通過運行定位列:
SELECT c.name From sys.columns c inner join sys.tables t on c.object_id = t.object_id Where t.name = 'tablename'
我最終還是想回2列,其的錶行數等於我查詢的表名中的列數。例如,
SELECT ColumnA, ColumnB, ColumnC FROM tblA WHERE ColumnA = ???
最終會被插入到表:
TABLE [dbo].[ResultTable](
[ColumnName] [varchar](max) NOT NULL,
[ColumnValue] [varchar](max) NOT NULL
)
所以SP返回的外觀有點像:
----------------------------
| ColumnName | ColumnValue |
----------------------------
| ColumnA | Hello |
----------------------------
| ColumnB | World |
----------------------------
| ColumnC | Fubar |
----------------------------
但使用TBLB會給你
----------------------------
| ColumnName | ColumnValue |
----------------------------
| Column1 | ABCDE |
----------------------------
| Column2 | 12345 |
----------------------------
如果tblA具有X c olumn,那麼返回的集合將有X行,但仍然是兩列。我知道這可以通過使用exec函數來完成,但不知道是否可以不使用它?
這是什麼目的?如果你想使用'sys.columns'中的值,那麼你將不得不使用動態SQL來按列名選擇。 –
@JohnOdom,目的是創建一個存儲過程,給定一個表名(例如'tblA','tblB',....,'tblN'),我可以做一個'SELECT n1,n2,.. ..來自tblN。我的問題是,我想嘗試創建一個足夠通用的sp,無論表名是什麼,它都會返回sys.tables中所有表的列。如果我在sp中包含函數'exec',那麼是不是會減慢sp? – Jason
@Jason然後,再次,爲什麼你不使用'SELECT *'?,爲什麼你需要一個存儲過程呢? – Lamak