且构网

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

如何循环在SQL Server 2005中存储过程内部创建的动态临时表的列

更新时间:2023-12-01 14:56:22

请检查以下代码,以使用SQL查询为表动态创建列.
"#tClients"是一个临时表,根据搜索条件具有帐户(此表可能具有多个行)

-使用DYNAMIC列创建表
创建表Clientslist(EmpUID int,EmployeeName varchar(50),JobStatus varchar(25),JobCode char(2),
类别char(1),TotalLines十进制(18,5),Supervisor varchar(50),
虚拟位)
将@Script声明为Varchar(8000)
将@Script_prepare声明为Varchar(8000)
Set @Script_prepare =``更改表Clientslist添加[?] varchar(100);''
设置@Script =''''
从#tClients中选择@Script = @Script + Replace(@Script_prepare,``?'',[Code]) 执行(@Script)
更改表Clientslist删除列虚拟


-动态地进行一些操作
宣告@i int,@ SQL varchar(4000),@ TableName sysname,@ ColumnName sysname,@ rc int
SET @i = 8-动态列的起始位置

SELECT ORDINAL_POSITION,TABLE_NAME,COLUMN_NAME
INTO#临时
来自INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME =``客户列表''

从#Temp WHERE ORDINAL_POSITION = @i
中选择SELECT @TableName = TABLE_NAME,@ColumnName = COLUMN_NAME SET @rc = @@ ROWCOUNT
@rc<> 0
开始

DECLARE @t_Lines十进制(18,2)

-这里我要更新表格中动态列的行数
SET @ t_Lines = 0
SELECT TOP 1 @ t_Lines = cast(行作为小数(18,2))来自#tEmpClient WHERE Category =''T''
从#tEmpClient WHERE SNo =中删除(从#tEmpClient WHERE Category =''T''中选择前1个SNO)
SET @SQL =``UPDATE''+ @TableName +''SET''+ @ColumnName +''=``+ Convert(varchar,@ t_Lines)+''WHERE Category =''''T'''' AND EmpUID =''+转换(varchar,@ t_EmpUID)+''''
EXEC(@SQL)


SET @i = @i +1
从#Temp WHERE ORDINAL_POSITION = @i
中选择SELECT @TableName = TABLE_NAME,@ColumnName = COLUMN_NAME SET @rc = @@ ROWCOUNT
END

选择*来自客户列表

删除表#Temp
DROP TABLE Clientslist
Please check the below code to create columns dynamically for a table using SQL query.
"#tClients" is a temp table having accounts as per search criteria ( this table may have mutiple rows)

--create table with DYNAMIC columns
create table Clientslist( EmpUID int, EmployeeName varchar(50),JobStatus varchar(25), JobCode char(2),
Category char(1),TotalLines decimal(18,5), Supervisor varchar(50),
dummy bit)
Declare @Script as Varchar(8000)
Declare @Script_prepare as Varchar(8000)
Set @Script_prepare = ''Alter table Clientslist Add [?] varchar(100);''
Set @Script = ''''
Select @Script = @Script + Replace(@Script_prepare, ''?'', [Code]) From #tClients
Exec (@Script)
Alter table Clientslist drop column dummy


--to do DYNAMICALLY some operations
DECLARE @i int, @SQL varchar(4000), @TableName sysname, @ColumnName sysname, @rc int
SET @i = 8 --Starting position of dynamic columns

SELECT ORDINAL_POSITION, TABLE_NAME, COLUMN_NAME
INTO #Temp
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''Clientslist''

SELECT @TableName = TABLE_NAME, @ColumnName = COLUMN_NAME FROM #Temp WHERE ORDINAL_POSITION = @i
SET @rc = @@ROWCOUNT
WHILE @rc <> 0
BEGIN

DECLARE @t_Lines decimal(18,2)

--here I am updating linecounts in the table for dynamic columns
SET @t_Lines=0
SELECT TOP 1 @t_Lines=cast(Lines as decimal(18,2)) FROM #tEmpClient WHERE Category=''T''
DELETE FROM #tEmpClient WHERE SNo=(SELECT TOP 1 SNO FROM #tEmpClient WHERE Category=''T'')
SET @SQL = ''UPDATE '' + @TableName + '' SET '' + @ColumnName + '' = ''+Convert(varchar,@t_Lines) + '' WHERE Category=''''T'''' AND EmpUID=''+convert(varchar,@t_EmpUID)+''''
EXEC (@SQL)


SET @i = @i + 1
SELECT @TableName = TABLE_NAME, @ColumnName = COLUMN_NAME FROM #Temp WHERE ORDINAL_POSITION = @i
SET @rc = @@ROWCOUNT
END

SELECT * FROM Clientslist

DROP TABLE #Temp
DROP TABLE Clientslist