我可以按SQL中的列数选择特定列吗? 像
这样的东西SELECT columns(0), columns(3), columns(5), columns(8) FROM TABLE
由于
答案 0 :(得分:6)
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'
此语句返回表格的第三列
您需要编写像
这样的transact SQL语句DECLARE @columnname nvarchar(100), @sql nvarchar(500)
SELECT @columnname = ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'
SET @sql = 'SELECT ' + @columnname + ' FROM mytable'
EXEC @sql
答案 1 :(得分:4)
我强烈建议不要这么复杂的答案。
正如其他人已经在你的问题下面指出的那样,你应该看看这个答案:
Access columns of a table by index instead of name in SQL Server stored procedure
SQL规范不是为DDL中的动态模式而构建的 DML。
接受它,不要在SELECT中使用数字作为列。它会降低性能,降低可读性,如果更改架构,它将明显失败。
答案 2 :(得分:3)
您必须使用动态SQL来执行此操作:
DECLARE @strSQL AS nvarchar(MAX)
DECLARE @strColumnName AS nvarchar(255)
DECLARE @iCounter AS integer
DECLARE @curColumns AS CURSOR
SET @iCounter = 0
SET @strSQL = N'SELECT '
SET @curColumns = CURSOR FOR
(
SELECT * FROM
(
SELECT TOP 99999
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T_Markers'
AND ORDINAL_POSITION < 4
ORDER BY ORDINAL_POSITION ASC
) AS tempT
)
OPEN @curColumns
FETCH NEXT FROM @curColumns INTO @strColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
-- PRINT @strColumnName
IF @iCounter = 0
SET @strSQL = @strSQL + N'
[' + @strColumnName + N'] '
ELSE
SET @strSQL = @strSQL + N'
,[' + @strColumnName + N'] '
SET @iCounter = @iCounter + 1
FETCH NEXT FROM @curColumns INTO @strColumnName
END
CLOSE @curColumns
DEALLOCATE @curColumns
SET @strSQL = @strSQL + N'
FROM T_Markers
'
PRINT @strSQL
答案 3 :(得分:0)
使用UNPIVOT将列转换为行。像这样:
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10
124000 124001 124002 124003 124004 124005 124006 124007 124008 124009
-将列转换为表#JobNos1
中的行SELECT JobNo INTO#JobNos1 FROM
(从#YourTable中选择F1,F2,F3,F4,F5,F6,F7,F8,F9,F10)AS cp
UNPIVOT
(JobNo FOR JobNos IN(F1,F2,F3,F4,F5,F6,F7,F8,F9,F10))向上
124000
124001
124002
124003
124004
124005
124006
124007
124008
124009
-需要一种选择行的方法,因此将行号添加到#JobNos2
创建表#JobNos2(JobNo int,Row int)
插入#JobNos2
从#JobNos1中选择SELECT JobNo,ROW_NUMBER()OVER(ORDER BY(SELECT 100))AS行
然后您可以执行以下操作:
SET @jobno =从#JobNos2中选择JobNo,其中Row = @SomeRowNumber
答案 4 :(得分:0)
我做了这个查询
declare @colCoun int
SELECT @colCoun =COUNT(*) -- get column count in your table
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_catalog = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE'
CREATE TABLE #temp([1] VARCHAR(max))
if(@colCoun>1)
BEGIN
DECLARE @cnt INT = 2;
WHILE @cnt <= @colCoun
BEGIN
Exec ('ALTER TABLE #temp ADD ['+ @cnt +'] varchar(max)')
SET @cnt = @cnt + 1;
END
END
insert into #temp
select * from YOUR_TABLE
select [1],[2] from #temp -- select your own column number in range of table