且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在SqlServer中如何在水平方向进行表设计

更新时间:2023-02-02 15:04:29

对此查询不可能,因此必须编写自己的存储过程.

例子
创建名称为tlbTextData的表
It is not possible with the query for this u have to write your own store procedure.

Example
Create Table of name tlbTextData
create table tlbTextData (fldTextKey varchar(10), fldTextVal varchar(10))
insert into tlbTextData values('One','1')
insert into tlbTextData values('Two','2')
insert into tlbTextData values('Three','3')
insert into tlbTextData values('Four','4')
insert into tlbTextData values('Five','5')



受约束的程序



Strored Procedure

DECLARE @ColNameAS VARCHAR(10),
		@RowElement AS VARCHAR(10),
		@SqlQuery AS NVARCHAR(300),
		@iColumnName AS INT,
		@iFirstTime AS INT,
		@AddColName AS NVARCHAR(10)

SELECT @iFirstTime=0

CREATE TABLE #tlbMemTable (fldColName VARCHAR(10))
   
DECLARE GetColumnName CURSOR FOR      
           SELECT column_name FROM Information_Schema.Columns WHERE table_name='tlbTextData'
OPEN GetColumnName      
FETCH NEXT FROM GetColumnName INTO @ColName     
WHILE(@@FETCH_STATUS = 0)    
BEGIN--1 
	INSERT INTO #tlbMemTable(fldColName) VALUES(@ColName)
	SET @iColumnName = 0 
	SELECT @SqlQuery = 'DECLARE GetRow CURSOR FOR SELECT '+ @ColName +' FROM tlbTextData' 
	EXEC sp_executesql @SqlQuery   
	OPEN GetRow
	FETCH NEXT FROM GetRow INTO @RowElement 
	WHILE(@@FETCH_STATUS = 0)    
	BEGIN--2 
		
		SELECT @AddColName = 'VAL'+CAST(@iColumnName AS VARCHAR(10))
		print @AddColName
		IF(@iFirstTime=0)
		BEGIN
			SELECT @SqlQuery = 'ALTER TABLE #tlbMemTable ADD '+@AddColName+' NVARCHAR(10)'
			EXEC(@SqlQuery)
		END
		
		SELECT @SqlQuery = 'UPDATE #tlbMemTable SET '+@AddColName+'='''+@RowElement+''''+' WHERE fldColName='''+@ColName +''''
		EXEC(@SqlQuery)		
		SET @iColumnName = @iColumnName + 1
		FETCH NEXT FROM GetRow INTO @RowElement 
	END--2
	CLOSE GetRow      
	DEALLOCATE GetRow
	SET @iFirstTime = 1
	FETCH NEXT FROM GetColumnName INTO @ColName   
END--1      
CLOSE GetColumnName      
DEALLOCATE GetColumnName   

SELECT * FROM #tlbMemTable
DROP TABLE #tlbMemTable



注意:如果您要使用它,请优化上述sp:)



Note : Please optimize above sp if ur going to use it :)