首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 存储过程动态变量问题(50分求助)
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2007-10-19 15:40:20 楼主
    都知道要查询所有纪录数是这个 Select Count(*) From TableName
    但是我在存储过程里有一个输出参数 @RecordCount和表变量@TableName,用这个参数输出记录数,@TableName是可变的表
    总记录数可以这个 Select count(*) From '+@TableName
    但是如何把它传给@RecordCount呢
    这样 @RecordCount=Select count(*) From '+@TableName
    和这样Select @RecordCount=count(*) From '+@TableName
    显然不行

    希望高手指点
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 15:45:361楼 得分:0
    补充一下 如果用的不是表变量@TableName
    直接用可知的表TableName
    用这个语句
    select @RecordCount=count(*) from TableName
    是可以的
    关键就是用了动态变量的问题

    请朋友们先测试再发布你的答案
    谢谢先
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wfevgch
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 15:48:382楼 得分:0
    参考一下
    declare @tablename sysname
    select @tablename = ''
    create table ##tmp (t_cnt int not null)
    exec ('insert ##tmp select count(*) from ' + @tablename )
    select * from ##tmp

    考虑并发的话,##tmp再加个主键,##tmp改用永久表也可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2007-10-19 15:50:123楼 得分:0
    DECLARE @Sql NVarchar(400),@RecordCount int,@TableName Varchar(80)

    SET @Sql=N'Select @RecordCount=count(*) From  '+@TableName

    EXEC SP_EXECUTESQL @Sql,N'@RecordCount int out',@RecordCount out

    PRINT @RecordCount
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yxh198358
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 15:50:554楼 得分:0
    Select @RecordCount=count(*) From @TableName
    这样是可以的啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2007-10-19 15:55:095楼 得分:0
    需要纠正楼主一个错误,@TableName 是一个用于替代表名的变量,而不是表变量;而表变量是一个特殊的类型。

    SQL code
    Declare @Sql NVarchar(400),@RecordCount Int,@TableName Varchar(80) Set @Sql=N 'Select @RecordCount=count(*) From '+@TableName Exec Sp_executesql @Sql,N '@RecordCount Int Out ',@RecordCount Out Select @RecordCount
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 15:56:376楼 得分:0
    聪明的一休
    你这个答案当然还不错
    不过我不是很喜欢用临时表

    子陌红尘
    你的这个我测试过,好像有点问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 15:57:157楼 得分:0
    需要纠正楼主一个错误,@TableName 是一个用于替代表名的变量,而不是表变量;而表变量是一个特殊的类型。

    知道了
    谢谢提醒
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 16:00:108楼 得分:0
    5天后才能送分???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oktell
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 16:02:439楼 得分:0
    我也提问了这么一个问题,还没有较好的解决,用临时表太复杂了吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2007-10-19 16:05:5710楼 得分:0
    SQL code
    Create Table Test(ID Int Identity(1,1),Code Varchar(8)) Insert into Test(Code) Values('AAAA') Insert into Test(Code) Values('AAAB') Insert into Test(Code) Values('AAAC') Insert into Test(Code) Values('AAAD') Insert into Test(Code) Values('AAAE') Insert into Test(Code) Values('AAAF') Go Declare @Sql NVarchar(400),@RecordCount Int,@TableName Varchar(80) Set @TableName='Test' Set @Sql=N'Select @RecordCount=count(*) From '+@TableName Exec Sp_executesql @Sql,N'@RecordCount Int Out ',@RecordCount Out Select @RecordCount as Num /* Num ----------- 6 */ Go Drop Table Test Go


    注意去掉套用样式之后在 N'...' 的N后面自动增加的空格。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hayou1231
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 16:13:3611楼 得分:0
    SQL codeCreate Table Test(ID Int Identity(1,1),Code Varchar(8))
    Insert into Test(Code) Values('AAAA')
    Insert into Test(Code) Values('AAAB')
    Insert into Test(Code) Values('AAAC')
    Insert into Test(Code) Values('AAAD')
    Insert into Test(Code) Values('AAAE')
    Insert into Test(Code) Values('AAAF')
    Go

    Declare @Sql NVarchar(400),@RecordCount Int,@TableName Varchar(80)

    Set @TableName='Test'

    Set @Sql=N'Select @RecordCount=count(*) From '+@TableName

    Exec Sp_executesql @Sql,N'@RecordCount Int Out ',@RecordCount Out

    Select @RecordCount as Num
    /*
    Num       
    -----------
    6
    */
    Go

    Drop Table Test
    Go


    注意去掉套用样式之后在 N '... ' 的N后面自动增加的空格。

    应该算是OK了
    能否解释下Exec Sp_executesql的用法
    好像多了个参数N'@RecordCount Int Out '
    不知道做何解释
    直接用exec 好像是不行的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oktell
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 16:14:0412楼 得分:0
    请 libin_ftsafe 朋友写个完整的,能运行的,现在看不懂。

    谢谢 。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2007-10-19 16:19:2013楼 得分:0
    sp_executesql
    执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。

    语法
    sp_executesql [@stmt =] stmt
    [
        {, [@params =] N'@parameter_name  data_type [,...n]' }
        {, [@param1 =] 'value1' [,...n] }
    ]

    参数
    [@stmt =] stmt

    包含 Transact-SQL 语句或批处理的 Unicode 字符串,stmt 必须是可以隐式转换为 ntext 的 Unicode 常量或变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符串联两个字符串)。不允许使用字符常量。如果指定常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。

    stmt 可以包含与变量名形式相同的参数,例如:

    N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'

    stmt 中包含的每个参数在 @params 参数定义列表和参数值列表中均必须有对应项。

    [@params =] N'@parameter_name  data_type [,...n]'

    字符串,其中包含已嵌入到 stmt 中的所有参数的定义。该字符串必须是可以隐式转换为 ntext 的 Unicode 常量或变量。每个参数定义均由参数名和数据类型组成。n 是表明附加参数定义的占位符。stmt 中指定的每个参数都必须在 @params 中定义。如果 stmt 中的 Transact-SQL 语句或批处理不包含参数,则不需要 @params。该参数的默认值为 NULL。

    [@param1 =] 'value1'

    参数字符串中定义的第一个参数的值。该值可以是常量或变量。必须为 stmt 中包含的每个参数提供参数值。如果 stmt 中包含的 Transact-SQL 语句或批处理没有参数,则不需要值。

    n

    附加参数的值的占位符。这些值只能是常量或变量,而不能是更复杂的表达式,例如函数或使用运算符生成的表达式。

    返回代码值
    0(成功)或 1(失败)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • free1879
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-10-19 17:08:1814楼 得分:0
    简单来说,如果sp_executesql带单一参数,那么跟EXECUTE()用法一样,只不过是UNICODE字符串,如果带三个参数,那么第二个参数指定字符串中的变量类型,第三个参数指定变量的字面值
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved