在sql-server中有一個問題,各位以前一定碰過??(20分)

  • 主题发起人 主题发起人 jesse.zhou
  • 开始时间 开始时间
J

jesse.zhou

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一個表a(aa,m1,m2,m3,.....)其中從m1到31一個月
123 01 02 01 02 01 .....
124 02 02 02 01 03 .....
我要修改某一的數據比如輸入12月12日則修改m12的數據,輸入12月15日則修改m15的數據,...
請問這樣的 sql怎樣寫?
 
用自定义函数呀
 
我想在一個存儲過程中實現
 
SqlServer中有类似宏替换的命令,我一下子记不大清命令,好像是excesql(反正有EXEC四个字),肯定有,我以前一直
用它来做字段的动态切换.
 
我想可以用query控件的索引号来做
 
在Delphi中,你可以自己用字符串处理SQL语句
假定你的表中所有字段都是字符串类型
var
sql: String; //你的SQL语句
Day: String; //用来保存用户输入的日,比如输入12月15日,则Day=15
MyData: String; //你要改到数据库中的内容
begin
Day := getInputDay(); //getInputDay()你自己实现吧^_^
MyData := 'some string';
sql := 'update a set m' + Day + ' = ''' + MyData +
''' where aa=''124''';
//gQuery是一个TADOQuery
gQuery.SQL.Text := Sql;
gQuery.ExecSql:
end;

如果在MS Sql Server中使用存储过程,可以这样
CREATE PROCEDURE update_a
(
@MyData varchar(), --你的数据
@Day varchar(2) --用户输入的日
)
as

declare @command varchar(1024)

select @command=
'update a set m' + @Day + ' = ''' + @MyData + ''' where aa=''124'''

exec (@command)

return 0
 
希望提供原碼??
 

/****** Object: Stored Procedure dbo.ChangeField Script Date: 1998-05-02 19:15:18 ******/
CREATE PROCEDURE ChangeField @ok bit=0 output AS
declare @alterSQL NVARCHAR(200)
declare @name char(20)
declare @nameOld char(20) --原名

declare @type char(20)
declare @len smallint
declare @del bit

declare cur_str cursor for
select Aname,Aname_Old ,Atype,alen,deltag from gz_stru where authority<>'固定' order by s_id

open cur_str
fetch next from cur_str into @name,@nameOld,@type,@len,@del
while @@FETCH_STATUS=0
begin
--删除字段
if @del=1
begin
SET @alterSQL='Alter table gz_data drop column '+ltrim(rtrim(@nameold))
exec sp_executesql @altersql
fetch next from cur_str into @name,@nameOld,@type,@len,@del
continue
end
--字段信息

IF @type='字符'
set @type='char('+ltrim(rtrim(cast(@len as char(5))))+')'
IF @type='数字'
set @type='[decimal]('+ltrim(rtrim(cast(@len as char(5))))+',2)'
IF @type='整形'
set @type='int'
--判断是否已经存在
select * from syscolumns c,sysobjects o where c.id=o.id and o.name='gz_data' and c.name=ltrim(rtrim(@nameOld))
if @@rowcount=0 --新增
SET @alterSQL='Alter table gz_data add '+ltrim(rtrim(@name))+' '+@type+' NULL'
else
begin
if @name<>@nameOld --先处理修改字段名的信息
begin
set @altersql='Sp_rename "gz_data.['+rtrim(@nameold)+']","'+rtrim(@name)+'","column"'
select ltrim(rtrim(@altersql))
exec sp_executesql @altersql --!!!就是这个系统存储过程sp_executesql--
end
set @altersql='alter table gz_data alter column '+ltrim(rtrim(@name))+' '+@type
end
select @altersql
exec sp_executesql @altersql

fetch next from cur_str into @name,@nameOld,@type,@len,@del
end
delete from gz_stru where deltag=1
if @@error>0
set @ok=0 --运行失败
else
set @ok=1
deallocate cur_str
SELECT @OK

GO
 
后退
顶部