这个创建表的SQL语句该怎么写?解决后给200分(0分)

  • 主题发起人 主题发起人 softdog
  • 开始时间 开始时间
S

softdog

Unregistered / Unconfirmed
GUEST, unregistred user!
要动态创建一个表(表A),表A的字段来自另外一个表(表B)的某条记录。
表B的记录数和值可能会变。

比如表B的记录如下:
----------------------------
id name remark
1 rec1
2 rec2
3 rec3
4 rec4
5 rec5
6 rec6

产生的表A的字段就是:
rec1 varchar(20)
rec2 varchar(20)
...
rec6 varchar(20)

这个SQL语句该怎么写呢?解决后给200分
 
只用一条sql 语句是没有用的
 
只要能创建几十条也可以,不过最好不用cursor.
 
var
i: Integer;
str: string;
begin
str := 'create table B (';
TableA.First;
while not TableA.Eof do
begin
Str := Str + #13#10 + TableA.FieldByName('Name').AsString
+ 'varchar(20),';
TableA.Next;
end;
SetLength(Str, Length(Str) - 1);
Str := Str + #13#10 + ')';
Query1.SQL.Text := Str;
Query1.ExecSQL;
...
end;
这样子动态生成应该差不多。
 
写存储过程吧
B表名base
A表名atable
游标 Add_Table
您可以把以下sql 语句定义为一个存储过程,注意没处理0或1个纪录,你自己改一下吧。

DECLARE Add_Table SCROLL CURSOR FOR
SELECT name, remark,id FROM base
ORDER BY id
OPEN Add_Table
DECLARE @name varchar(40),@remark varchar(30),@id int
DECLARE @RESULT varchar(240)

FETCH NEXT FROM Add_Table
INTO @name,@remark,@id
select @RESULT = "Create table atable("+@name+"varchar(20)"
WHILE @@FETCH_STATUS = 0
BEGIN
-- PRINT "ID"+";Name: " + @name + ";Remark" + @remark
-- Select @name

FETCH NEXT FROM Add_Table
INTO @name,@remark,@ID
Select @RESULT = @RESULT +","+ @name+"varchar(20)"
END
select @result = @result + ")"
CLOSE Add_Table
DEALLOCATE Add_Table

GO
 
改了一下不用cursor的话,用bbkxjy的方法吧
DECLARE Add_Table SCROLL CURSOR FOR
SELECT name, remark,id FROM base
ORDER BY id
OPEN Add_Table

DECLARE @name varchar(40),@remark varchar(30),@id int
DECLARE @RESULT varchar(240)

FETCH NEXT FROM Add_Table
INTO @name,@remark,@id
select @RESULT = "Create table atable(" + @name+"varchar(20)"
WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM Add_Table
INTO @name,@remark,@ID
if (@@FETCH_STATUS<>-1) Select @RESULT = @result+","+@name+"varchar(20)"
END
select @result = @result + ")"
select @result
CLOSE Add_Table
DEALLOCATE Add_Table

GO
 
--用存储过程来实现吧
--t1是表b,t2是动态表a
--为何不使用游标,即使你没有显示使用游标,在操作数据集时,也隐式使用了游标
--最后用动态执行。
CREATE PROCEDURE sp1
AS
If Exists(Select * From sysobjects where id=object_id(N'[dbo].[t2]'))
Drop table [dbo].[t2]
Declare @TableStr varchar(128)
Declare @FieldStr varchar(128)

Select @TableStr='Create Table t2 ('
Declare crT2 cursor for Select [name] From t1
Open crT2
Fetch Next From crT2 into @FieldStr
While (@@Fetch_Status<>-1)
Begin
IF @@Fetch_Status<>-2
Begin
Select @TableStr=@TableStr+' '+@FieldStr+' Varchar(20),'
End
Fetch Next From crT2 Into @FieldStr
End
Close crT2
Deallocate crT2

Select @TableStr=SubString(@TableStr,1,len(@TableStr)-1)
Select @TableStr=@TableStr+')'

Exec (@TableStr)
 
本来是想知道有没有不用cursor的sql语句的解决方法的,不过看到大家这么热心的回答,感动万分,呵呵!
leepin, bbkxjy, tbase等着拿分吧。

如果有朋友能不用cursor来解决的话(用sql语句,not delphi语句)还有分。
 
declare @temp_1 varchar(20)
declare @temp_2 varchar(255)
DECLARE authors_cursor CURSOR
FOR SELECT name FROM T_1
OPEN authors_cursor
FETCH FROM authors_cursor into @temp_1
select @temp_2=@temp_1+' varchar(20) null '
WHILE @@FETCH_STATUS = 0
BEGIN
fetch next FROM authors_cursor into @temp_1
if @@FETCH_STATUS = 0
select @temp_2=@temp_2+','+char(13)+@temp_1+' varchar(20) null '
end
CLOSE authors_cursor
DEALLOCATE authors_cursor
select @temp_2='create table t_2 ('+ @temp_2+')'
print @temp_2
exec(@temp_2)
 
接受答案了.
 

Similar threads

后退
顶部