存储过程可以包含alter view语句吗?

[复制链接]
查看11 | 回复8 | 2011-9-13 07:03:04 | 显示全部楼层 |阅读模式
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
修改exec这一段为:exec(\'ALTERVIEW[dbo].[zbh_khchhz2_2]ASSELECTKHDM,SUM(CASEdjlxWHEN[pfxh3]THENSLELSE[0]END)ASpfch,SUM(CASEWHENdjlxIN([pfdlls],[pfdllt],[sdlsxh],[sdlsth])THENSLELSE[0]END)ASkhxsFROMdbo.zbh_khchhz2_1WHERE(RQ=\'convert(nvarchar(10),@rq,120)\')GROUPBYKHDM\')追问提示:关键字\'CONVERT\'附近有语法错误。并且语句中的[pfxh3]字段用[]标起来是不是错了啊,我执行存储过程时,他会提示找不到列[pfxh3]找不到列[0],所有用[]括起来的字段都提示找不到列??
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
用方括号把对象名标起来是没有问题的,如果提示找不到,你应该检查一下你的数据表结构convert错误的地方,少了几个单引号,修改如下:WHERE(RQ=\'\'\'convert(nvarchar(10),@rq,120)\'\'\')
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
我修改成了WHERE(RQ=\'\'\'convert(nvarchar(10),@rq,120)\'\'\'),还是一样的提示,另外我用[]标的都是字符串不是列名??我直接用修改视图语句的时候是正确的。
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
修改一下declare@SQLnvarchar(max)select@SQL=\'ALTERVIEW[dbo].[zbh_khchhz2_2]ASSELECTKHDM,SUM(CASEdjlxWHEN[pfxh3]THENSLELSE[0]END)ASpfch,SUM(CASEWHENdjlxIN([pfdlls],[pfdllt],[sdlsxh],[sdlsth])THENSLELSE[0]END)ASkhxsFROMdbo.zbh_khchhz2_1WHERE(RQ=\'\'\'convert(nvarchar(10),@rq,120)\'\'\')GROUPBYKHDM\'Print@SQL把这个SQL输出来,然后执行一下,看看什么地方不对
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
ALTERVIEW。。。ASSELECTKHDM,SUM(CASEdjlxWHEN[pfxh3]THENSLELSE[0]END)ASpfch,SUM(CASEWHENdjlxIN([pfdlls],[pfdllt],[sdlsxh],[sdlsth])THENSLELSE[0]END)ASkhxsFROMdbo.zbh_khchhz2_1WHERE(RQ=\'2011-09-20\')GROUPBYKHDM以上是输出的SQL,执行的时候会提示【列名\'pfxh3\'无效。】[]括起来的字符串都会提示这个错误??
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
给你一段SQLServer的语句,表名、栏位、试图名换成你自己的IFEXISTS(SELECT*FROMsys.viewsWHEREobject_id=OBJECT_ID(N\'[dbo].[v_pubbu]\'))DROPVIEW[dbo].[v_pubbu];GO--此试图一开始查询所有栏位createviewv_pubbuasselect*frompubBU;GO--此存储过程会改变试图的定义,使其只查一个栏位createproceduresp_change_viewasbegin--使用动态执行的方式可以实现试图的修改,直接写则不通过exec(\'alterviewdbo.v_pubbuasselectbucodefrompubBU\');endGOselect*fromv_pubbu;--此时是所有栏位execsp_change_view;select*fromv_pubbu;--此时只有一个栏位了追问我按照你的方法试了,(我的修改视图里面有参数),执行存储过程时提示【必须声明标量变量\"@rq\"。】,这个变量我有在存储过程中声明了createproceduretq_khchhz@rqdatetime,是哪里错误了???
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
把你的代码贴出来
回复

使用道具 举报

千问 | 2011-9-13 07:03:04 | 显示全部楼层
1、说明:创建数据库CREATEDATABASEdatabase-name2、说明:删除数据库dropdatabasedbname3、说明:备份sqlserver---创建备份数据的deviceUSEmasterEXECsp_addumpdevice\'disk\',\'testBack\',\'c:\\mssql7backup\\MyNwind_1.dat\'---开始备份BACKUPDATABASEpubsTOtestBack4、说明:创建新表createtabletabname(col1type1[notnull][primarykey],col2type2[notnull],..)根据已有的表创建新表:A:createtabletab_newliketab_old(使用旧表创建新表)B:createtabletab_newasselectcol1,col2…fromtab_olddefinitiononly5、说明:删除新表droptabletabname6、说明:增加一个列Altertabletabnameaddcolumncoltype注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。7、说明:添加主键:Altertabletabnameaddprimarykey(col)说明:删除主键:Altertabletabnamedropprimarykey(col)8、说明:创建索引:create[unique]indexidxnameontabname(col….)删除索引:dropindexidxname注:索引是不可更改的,想更改必须删除重新建。9、说明:创建视图:createviewviewnameasselectstatement删除视图:dropviewviewname10、说明:几个简单的基本的sql语句选择:select*fromtable1where范围插入:insertintotable1(field1,field2)values(value1,value2)删除:deletefromtable1where范围更新:updatetable1setfield1=value1where范围查找:select*fromtable1wherefield1like’%value1%’---like的语法很精妙,查资料!排序:select*fromtable1orderbyfield1,field2[desc]总数:selectcount*astotalcountfromtable1求和:selectsum(field1)assumvaluefromtable1平均:selectavg(field1)asavgvaluefromtable1最大:selectmax(field1)asmaxvaluefromtable1最小:selectmin(field1)asminvaluefromtable111、说明:几个高级查询运算词A:UNION运算符UNION运算符通过组合其他两个结果表(例如TABLE1和TABLE2)并消去表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE1就是来自TABLE2。B:EXCEPT运算符EXCEPT运算符通过包括所有在TABLE1中但不在TABLE2中的行并消除所有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPTALL),不消除重复行。C:INTERSECT运算符INTERSECT运算符通过只包括TABLE1和TABLE2中都有的行并消除所有重复行而派生出一个结果表。当ALL随INTERSECT一起使用时(INTERSECTALL),不消除重复行。注:使用运算词的几个查询结果行必须是一致的。12、说明:使用外连接A、leftouterjoin:左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.cB:rightouterjoin:右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。C:fullouterjoin:全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。其次,大家来看一些不错的sql语句1、说明:复制表(只复制结构,源表名:a新表名:b)(Access可用)法一:select*intobfromawhere11法二:selecttop0*intobfroma2、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Access可用)insertintob(a,b,c)selectd,e,ffromb;3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’where条件例子:..frombin\'\"1;8、说明:between的用法,between限制查询数据范围时包括了边界值,notbetween不包括select*fromtable1wheretimebetweentime1andtime2selecta,b,c,fromtable1whereanotbetween数值1and数值29、说明:in的使用方法select*fromtable1wherea[not]in(‘值1’,’值2’,’值4’,’值6’)10、说明:两张关联表,删除主表中已经在副表中没有的信息deletefromtable1wherenotexists(select*fromtable2wheretable1.field1=table2.field1)11、说明:四表联查问题:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....12、说明:日程安排提前五分钟提醒SQL:select*from日程安排wheredatediff(\'minute\',f开始时间,getdate())513、说明:一条sql语句搞定数据库分页selecttop10b.*from(selecttop20主键字段,排序字段from表名orderby排序字段desc)a,表名bwhereb.主键字段=a.主键字段orderbya.排序字段14、说明:前10条记录selecttop10*formtable1where范围15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)selecta,b,cfromtablenametawherea=(selectmax(a)fromtablenametbwheretb.b=ta.b)16、说明:包括所有在TableA中但不在TableB和TableC中的行并消除所有重复行而派生出一个结果表(selectafromtableA)except(selectafromtableB)except(selectafromtableC)17、说明:随机取出10条数据selecttop10*fromtablenameorderbynewid()18、说明:随机选择记录selectnewid()19、说明:删除重复记录Deletefromtablenamewhereidnotin(selectmax(id)fromtablenamegroupbycol1,col2,...)20、说明:列出数据库里所有的表名selectnamefromsysobjectswheretype=\'U\'21、说明:列出表里的所有的selectnamefromsyscolumnswhereid=object_id(\'TableName\')22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case。selecttype,sum(casevenderwhen\'A\'thenpcselse0end),sum(casevenderwhen\'C\'thenpcselse0end),sum(casevenderwhen\'B\'thenpcselse0end)FROMtablenamegroupbytype显示结果:typevenderpcs电脑A1电脑A1光盘B2光盘A2手机B3手机C323、说明:初始化表table1TRUNCATETABLEtable124、说明:选择从10到15的记录selecttop5*from(selecttop15*fromtableorderbyidasc)table_别名orderbyiddesc
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行