我有一张桌子,但我不知道它的列。它的名字是X
我可以使用以下代码找到它的列:
DECLARE @columnNames NVARCHAR(4000) = ''
SELECT @columnNames = @columnNames + ', ' + COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'X'
现在,我想在我的表中使用select语句,但是如何?
我想,应该是那样的。我找不到正确的方法:
SELECT SUBSTRING(@columnNames, 2, LEN(@columnNames)) FROM X
编辑:
实际上我想合并没有id列的列。
DECLARE @columnNames NVARCHAR(4000) = ''
SELECT @columnNames = @columnNames + ' + ' + COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = 'X' AND COLUMN_NAME <> 'id'
然后
SELECT SUBSTRING(@columnNames, 4, LEN(@columnNames)) FROM X
答案 0 :(得分:2)
根据澄清的目标和解释为什么*
不适合您,您需要连接整个SELECT
语句并使用动态SQL。您应该使用QUOTE_NAME
来避免非标准名称出现问题。
请参阅The Curse and Blessings of Dynamic SQL: Dealing with Dynamic Table and Column Names
答案 1 :(得分:2)
如果您选择表格的所有列,为什么不使用SELECT * FROM X
?另一种方法是使用动态sql,这不是一个好主意。
答案 2 :(得分:1)
你需要使用动态SQL来做到这一点,但要注意危险,请阅读http://www.sommarskog.se/dynamic_sql.html
但是既然你选择了所有专栏,我就没有看到你在做什么......只需使用SELECT * FROM X
答案 3 :(得分:1)
如果您要选择要提取的字符串中的字段,则需要使用EXEC
(或sp_executesql
)
DECLARE @columnNames NVARCHAR(4000) = ''
SELECT @columnNames = @columnNames + case when len(@columnNames)=0 then '' else ', ' end + COLUMN_NAME FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = X
DECLARE @SQL NVARCHAR(1024) = 'select ' + @columnNames + ' from X'
EXEC (@SQL)