言いたいselectステートメントがあります。選びたい
SELECT COLUMN_NAME AS FieldName FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table1'
ただし、table1の特定の行であるValueという名前の別の列を作成したいので、列名と対応する単一の値の行があります。これにアプローチする方法について何か考えはありますか?
言いたいselectステートメントがあります。選びたい
SELECT COLUMN_NAME AS FieldName FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table1'
ただし、table1の特定の行であるValueという名前の別の列を作成したいので、列名と対応する単一の値の行があります。これにアプローチする方法について何か考えはありますか?
次のクエリは、各列の値(最小値)を生成します。
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
ただし、これにより、行ごとに個別のクエリが生成されます。それらを組み合わせるには、文字列集約連結が必要です。これは、SQLServerで行う方法です。
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);
クロス結合を使用します。これは、結合のない2つのテーブルから選択した場合(つまり、from t1, t2
)は暗黙的です。
SELECT COLUMN_NAME AS FieldName,
Table1.MyField
FROM
INFORMATION_SCHEMA.COLUMNS, Table1
WHERE
TABLE_NAME = 'table1'
AND
MyTable.ID = 123
私は実際に少しクレイジーな解決策を思いついたが、それはうまくいく:
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機能は、クエリを最適化してパフォーマンスを向上させます