SQL动态查询,动态更新的问题

基洛夫级 2017-11-15 10:56:03
请问老师:

有一组这样的数表,想要动态更新比如说name为tom,字段值为A的值,让tom的A值加3 该怎么弄?
第二问题就是动态查询的问题,动态查询语句

declare @科目 varchar(10);
declare @name varchar(10)
set @课目='A';
set @name='Tom';
exec('select '+@项目+' from tab1 where name ='+@name )

输入查询后显示列名Tom无效,但是如果我把name换成ID(int)

动态查询语句变为:

declare @项目 varchar(10);
declare @id varchar(10)
declare @sql Nvarchar(1000)
set @项目='A';
set @id=1;
exec('select '+@项目+' from tab where id ='+@id)

是可以正常查询的。这是为什么呢?
...全文
358 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
一般一个列表页面, 一个编辑页面, 列表页面点修改可进入编辑页面。



比方说你想把 小毛 改成 小毛头, 直接将这个用户所有的信息发回给数据库(即使有些字段比如用户类型没有改过也要传),
一次性全部更新即可, 不需要判断来判断去。

你这个也一样, 编辑页面内, 老师想改哪项就改哪项,想加多少加多少, 无所谓。
页面上变动一下数值, 点确定按钮后, 将页面所有字段的值一起传给数据库更新就是了。

建议你先找 实战类型 本书看看, 靠自己摸索不合适。
比方说, 你根本都没有用到参数化, 这个在工作场合根本不可能。
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 13 楼 yenange 的回复:
[quote=引用 12 楼 u012916502 的回复:] [quote=引用 11 楼 yenange 的回复:] 你是在做网站之类的工作应用, 还是在学习 SQL Server ?
一边应用一边学习吧 导师要我做一个系统,sql也没怎么接触过,只好边学边用了[/quote] 你到底要不要做网站(应用)? 做应用的话根本不是你这个思路[/quote] 那请问老师做应用是什么思路呢?
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
老师请问一下做应用思路是什么样子
吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
引用 12 楼 u012916502 的回复:
[quote=引用 11 楼 yenange 的回复:] 你是在做网站之类的工作应用, 还是在学习 SQL Server ?
一边应用一边学习吧 导师要我做一个系统,sql也没怎么接触过,只好边学边用了[/quote] 你到底要不要做网站(应用)? 做应用的话根本不是你这个思路
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 11 楼 yenange 的回复:
你是在做网站之类的工作应用, 还是在学习 SQL Server ?
一边应用一边学习吧 导师要我做一个系统,sql也没怎么接触过,只好边学边用了
吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
你是在做网站之类的工作应用, 还是在学习 SQL Server ?
吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
引用 7 楼 u012916502 的回复:
但是有语法错误:'WHERE' 附近有语法错误。

DECLARE @sql NVARCHAR(MAX),@set NVARCHAR(MAX),@where NVARCHAR(MAX)
SET @set=' A=A+3 '
SET @where=' [name]=''tom'' '
SET @sql='UPDATE tab1 SET '+@set + ' WHERE '+@where
EXEC (@sql)

少写一个加号
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
DECLARE @sql NVARCHAR(MAX),@set NVARCHAR(MAX),@where NVARCHAR(MAX)
SET @set=' A=A+3 '
SET @where=' [name]=''tom'' '
SET @sql='UPDATE tab1 SET '+@set' WHERE '+@where
EXEC (@sql)

-- 你要的就是上面这样?
-- 其实这样并不好,尽量避免动态SQL, 一来不好看也不易维护,二来不安全
-- 一般情况下,都直接更新所有字段就是了,其它字段原封不动就是。省很多事
加分的分数也是动态的
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 4 楼 acen_chen 的回复:
拼接update的sql串呀。。。
谢谢老师您的回答。 对,我刚刚接触,不太懂,拼接好久都没拼成功。。
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
DECLARE @sql NVARCHAR(MAX),@set NVARCHAR(MAX),@where NVARCHAR(MAX)
SET @set=' A=A+3 '
SET @where=' [name]=''tom'' '
SET @sql='UPDATE tab1 SET '+@set' WHERE '+@where
EXEC (@sql)

-- 你要的就是上面这样?
-- 其实这样并不好,尽量避免动态SQL, 一来不好看也不易维护,二来不安全
-- 一般情况下,都直接更新所有字段就是了,其它字段原封不动就是。省很多事
谢谢老师的回答。 但是有语法错误:'WHERE' 附近有语法错误。老师您这不同符合我想做的东西 我想做的是比如说一个学生 他有语文A,数学B的平时分 学生TOM语文课表现好了学生tom语文这一项加3分,学生JACK数学表现好了学生JACK数学这一项加3分。 现在是有两个想法,一个是第二个问题的思路,先把学生tomA项拿出来在加完分后在放回去,另一个思路是直接在SQL中加分。 两者都是要用到动态SQL语句,不知老师有什么新的思路?
顺势而为1 2017-11-15
  • 打赏
  • 举报
回复
引用 3 楼 u012916502 的回复:
[quote=引用 2 楼 appetizing_fish1 的回复:] @name是字符串变量, 动态SQL中需加单双引号转义


declare @科目 varchar(10);
declare @name varchar(10)
set @课目='A';
set @name='Tom';
exec('select '+@项目+' from tab1 where name ='''+@name+''''  )

谢谢老师回答! 请问第一个问题是怎么弄呢?怎么动态更新某一行某一列的值呢?[/quote]


if not object_id('tempdb..#tmp_data') is null 
      drop table #tmp_data

create table #tmp_data(
        name varchar(10),
		A int,
		B int)

INSERT INTO #tmp_data 
Select 'jack',1,1 union 
Select 'jason',2,3 union
Select 'tom',4,6

DECLARE @name varchar(10)
SET @name='Tom'
DECLARE @sql nvarchar(200)
SET @sql='UPDATE #Tmp_data SET A=A+3 Where name='''+@name+''''
Exec (@sql)


吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
DECLARE @sql NVARCHAR(MAX),@set NVARCHAR(MAX),@where NVARCHAR(MAX)
SET @set=' A=A+3 '
SET @where=' [name]=''tom'' '
SET @sql='UPDATE tab1 SET '+@set' WHERE '+@where
EXEC (@sql)

-- 你要的就是上面这样?
-- 其实这样并不好,尽量避免动态SQL, 一来不好看也不易维护,二来不安全
-- 一般情况下,都直接更新所有字段就是了,其它字段原封不动就是。省很多事
acen_chen 2017-11-15
  • 打赏
  • 举报
回复
拼接update的sql串呀。。。
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 2 楼 appetizing_fish1 的回复:
@name是字符串变量, 动态SQL中需加单双引号转义


declare @科目 varchar(10);
declare @name varchar(10)
set @课目='A';
set @name='Tom';
exec('select '+@项目+' from tab1 where name ='''+@name+''''  )

谢谢老师回答! 请问第一个问题是怎么弄呢?怎么动态更新某一行某一列的值呢?
顺势而为1 2017-11-15
  • 打赏
  • 举报
回复
@name是字符串变量, 动态SQL中需加单双引号转义


declare @科目 varchar(10);
declare @name varchar(10)
set @课目='A';
set @name='Tom';
exec('select '+@项目+' from tab1 where name ='''+@name+''''  )

acen_chen 2017-11-15
  • 打赏
  • 举报
回复
name都高亮了,说明是关键字啊。。。
吉普赛的歌 2017-11-15
  • 打赏
  • 举报
回复
没事就结贴吧
基洛夫级 2017-11-15
  • 打赏
  • 举报
回复
引用 16 楼 yenange 的回复:
一般一个列表页面, 一个编辑页面, 列表页面点修改可进入编辑页面。 比方说你想把 小毛 改成 小毛头, 直接将这个用户所有的信息发回给数据库(即使有些字段比如用户类型没有改过也要传), 一次性全部更新即可, 不需要判断来判断去。 你这个也一样, 编辑页面内, 老师想改哪项就改哪项,想加多少加多少, 无所谓。 页面上变动一下数值, 点确定按钮后, 将页面所有字段的值一起传给数据库更新就是了。 建议你先找 实战类型 本书看看, 靠自己摸索不合适。 比方说, 你根本都没有用到参数化, 这个在工作场合根本不可能。
嗯嗯,那谢谢老师。学习到了

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧