này nên làm việc cho bất kỳ bảng, nhưng trong ví dụ của tôi, tôi chỉ cần tạo một thử nghiệm một. Bạn cần đặt tên bảng trong @YourTableName. Ngoài ra, bạn cần phải đặt @YourTableWhere để giới hạn kết quả thành một hàng, nếu không kết quả đầu ra sẽ lạ với nhiều hàng được trộn lẫn với nhau.
thử điều này:
BEGIN TRY
CREATE TABLE YourTestTable
(RowID int primary key not null identity(1,1)
,col1 int null
,col2 varchar(30)
,col3 varchar(20)
,col4 money
,StatusValue char(1)
,xyz_123 int
)
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (1234,'wow wee!','this is a long test!',1234.56,'A',98765)
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (543,'oh no!','short test',0,'I',12)
END TRY BEGIN CATCH END CATCH
select * from YourTestTable
DECLARE @YourTableName varchar(1000)
DECLARE @YourTableWhere varchar(1000)
DECLARE @YourQuery varchar(max)
SET @YourTableName='YourTestTable'
set @YourTableWhere='y.RowID=1'
SELECT
@YourQuery = STUFF(
(SELECT
' UNION '
+ 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @YourTableName
FOR XML PATH('')
), 1, 7, ''
)
PRINT @YourQuery
EXEC (@YourQuery)
OUTPUT:
RowID col1 col2 col3 col4 StatusValue xyz_123
----------- ----------- ------------------------------ -------------------- --------------------- ----------- -----------
1 1234 wow wee! this is a long test! 1234.56 A 98765
2 543 oh no! short test 0.00 I 12
SELECT 'RowID', CONVERT(varchar(max),RowID) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col1', CONVERT(varchar(max),col1) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col2', CONVERT(varchar(max),col2) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col3', CONVERT(varchar(max),col3) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col4', CONVERT(varchar(max),col4) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'StatusValue', CONVERT(varchar(max),StatusValue) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'xyz_123', CONVERT(varchar(max),xyz_123) FROM YourTestTable y WHERE y.RowID=1
----------- ------------------------
col1 1234
col2 wow wee!
col3 this is a long test!
col4 1234.56
RowID 1
StatusValue A
xyz_123 98765
EDIT
Đối với khả năng tương thích SQL Server 2000, bạn sẽ có thể thay thế varchar (max) với varchar (8000) và sử dụng tùy chọn này thay cho truy vấn SELECT @YourQuery
từ mã ở trên:
SELECT
@YourQuery=ISNULL(@YourQuery+' UNION ','')
+ 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @YourTableName
Câu hỏi của bạn thiếu bất kỳ chi tiết thực sự nào - bạn đang xử lý (các) bảng nào và các kiểu dữ liệu cột là gì? Phiên bản của SQL Server quá, xin. –
phiên bản nào của SQL Server cụ thể? Và bạn có đang đếm chỉ có 1 hàng dữ liệu hay cột 1 sẽ là tên cột và tất cả các cột khác là dữ liệu cho cột đó? –
Tôi có thể hiểu muốn xoay các hàng thành các cột, nhưng các cột thành các hàng? Bạn đang thực sự cố gắng làm gì? –