SQL模式和值

SQL模式和值,sql,sql-server,Sql,Sql Server,我有一个select语句要做。我想选择 SELECT COLUMN_NAME AS FieldName FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table1' 但是,我想创建另一个名为Value的列,它是表1中的一个特定行 所以我有列名行和相应的单个值。你对如何处理这个问题有什么想法吗 使用交叉联接,如果您只从两个没有联接的表中进行选择(即从t1、t2中选择),这是隐式的: 以下查询为每列生成一个值(最小值): S

我有一个select语句要做。我想选择

SELECT COLUMN_NAME AS FieldName FROM   
INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'table1'
但是,我想创建另一个名为Value的列,它是表1中的一个特定行
所以我有列名行和相应的单个值。你对如何处理这个问题有什么想法吗

使用交叉联接,如果您只从两个没有联接的表中进行选择(即从t1、t2中选择
),这是隐式的:


以下查询为每列生成一个值(最小值):

    SELECT '''select '+COLUMN_NAME+''' AS FieldName, (select cast(MIN('+COLUMN_NAME+') as varchar(8000)) from '+const.tablename+')'
    FROM INFORMATION_SCHEMA.COLUMNS c cross join
         (select 'AllCurveNames' as tablename) const
    WHERE c.TABLE_NAME = const.tablename
但是,这会为每一行生成一个单独的查询。要将它们组合在一起,需要字符串聚合连接。以下是在SQL Server中执行此操作的方式:

    declare @sql varchar(max);

    SELECT @sql = (select 'select '''+COLUMN_NAME+''' AS FieldName, (select cast(MIN('+COLUMN_NAME+') as varchar(8000)) from '+const.tablename + ') union all '
                   FROM INFORMATION_SCHEMA.COLUMNS c cross join
                        (select WHATEVER as tablename) const
                   WHERE c.TABLE_NAME = const.tablename
                   for xml path('')
                  );
    select @sql = LEFT(@sql, len(@sql) - 9);
    exec(@sql);

事实上,我想出了一个有点疯狂的解决方案,但它奏效了:

declare @tbl_name as varchar(255)
declare @field as varchar(255)
declare @val as varchar(255)
declare @SQL as nvarchar(4000)

create table #tbl ( [FieldName][varchar](255), [FieldVal][varchar](255))

set @tbl_name = 'table1'

DECLARE mah_cursor CURSOR FAST_FORWARD 
FOR 
SELECT COLUMN_NAME FROM  
INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @tbl_name

OPEN mah_cursor

FETCH NEXT FROM mah_cursor INTO @field 

WHILE @@FETCH_STATUS = 0
BEGIN



set @SQL = 'set @val = (Select top 1 ' + @field + ' from ' + @tbl_name + ')' 
print @SQL


exec sp_executesql @query = @SQL, @params = N'@val varchar(255) OUTPUT', @val = @val      OUTPUT

 insert into #tbl ([FieldName],[FieldVal] ) values (@field, @val)

 FETCH NEXT FROM mah_cursor INTO @field
 END

CLOSE mah_cursor 
DEALLOCATE mah_cursor 

select * from #tbl

drop table #tbl
它循环遍历每个值并将其相加。Fast_Forward功能优化查询以获得高性能

表1中的“特定行”是什么意思?您可以向SQL查询添加常量,只需选择“值”
请参见
declare @tbl_name as varchar(255)
declare @field as varchar(255)
declare @val as varchar(255)
declare @SQL as nvarchar(4000)

create table #tbl ( [FieldName][varchar](255), [FieldVal][varchar](255))

set @tbl_name = 'table1'

DECLARE mah_cursor CURSOR FAST_FORWARD 
FOR 
SELECT COLUMN_NAME FROM  
INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @tbl_name

OPEN mah_cursor

FETCH NEXT FROM mah_cursor INTO @field 

WHILE @@FETCH_STATUS = 0
BEGIN



set @SQL = 'set @val = (Select top 1 ' + @field + ' from ' + @tbl_name + ')' 
print @SQL


exec sp_executesql @query = @SQL, @params = N'@val varchar(255) OUTPUT', @val = @val      OUTPUT

 insert into #tbl ([FieldName],[FieldVal] ) values (@field, @val)

 FETCH NEXT FROM mah_cursor INTO @field
 END

CLOSE mah_cursor 
DEALLOCATE mah_cursor 

select * from #tbl

drop table #tbl