除非我錯過了您的問題的細微差別,否則使用COLUMNS的INFORMATION_SCHEMA表。該查詢標識了表dbo.dummy中所需的所有列。
SELECT
IC.COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS IC
WHERE
IC.TABLE_SCHEMA = 'dbo'
AND IC.TABLE_NAME = 'dummy'
AND IC.IS_NULLABLE = 'NO'
在做了更多的思考之後,也許你想要一個通用查詢來抓取所有需要的列,然後構建出選擇查詢。此查詢涵蓋了可能的請求
DECLARE
@hax varchar(max)
, @schemaName sysname
, @tableName sysname
SELECT
@schemaName = 'dbo'
, @tableName = 'dummy'
; WITH A AS
(
-- this query identifies all the columns that are not nullable
SELECT
IC.TABLE_SCHEMA + '.' + IC.TABLE_NAME AS tname
, IC.COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS IC
WHERE
IC.TABLE_SCHEMA = @schemaName
AND IC.TABLE_NAME = @tableName
AND IC.IS_NULLABLE = 'NO'
)
, COLUMN_SELECT (column_list) AS
(
-- this query concatenates all the column names
-- returned by the above
SELECT STUFF((SELECT '], [' + A.Column_Name
FROM A
FOR XML PATH('')),1, 2, '')
)
-- Use the above to build a query string
SELECT DISTINCT
@hax = 'SELECT ' + CS.column_list + '] FROM ' + A.tname
FROM
A
CROSS APPLY
COLUMN_SELECT CS
-- invoke the query
EXECUTE (@hax)
我喜歡這個答案。沒有想過一個觀點。 –