SQL存储过程@变量可以放字段吗?

chai1338 2010-10-20 12:06:37
如题,比如我想根据某个字段排序(多个字段取其一)
order by XXX
我可以定义XX为@变量吗?
在后台 给@变量 传要排序的字段
把@变量定义为什么类型?
...全文
309 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
缪军 2010-10-20
  • 打赏
  • 举报
回复
哎,本来不想回复的,看看楼上几位的答复不得不说两句,
直接exec字符串会导致注入危险(因为参数会变成command执行),并且每次都要编译,执行效率低,应该使用参数化的sql,也就是系统存储过程sp_executesql执行,
这里写个小例子:
DECLARE 
@ID_ex BIGINT --声明输入参数1
,@Str_ex NVARCHAR(50) --声明输入参数2
,@SqlStr NVARCHAR(4000) --声明字符串:用以提交参数化的Sql语句
,@Param_Def NVARCHAR(4000); --声明字符串:用以定义动态Sql的参数列表

SET @ID_ex = 0; --初始化,模拟输入
SET @Str_ex = N'aaa'; --初始化,模拟输入
SET @SqlStr = N'SELECT * FROM App WHERE AppId >= @ID OR @SearchStr=''aaa'' ';
SET @Param_Def = N'@ID BIGINT,@SearchStr NVARCHAR(50)';

EXEC sp_executesql
@SqlStr --提交参数化的Sql语句
,@Param_Def --参数定义
,@ID=@ID_ex --参数替换1
,@SearchStr=@Str_ex; --参数替换2


更多细节请参考MSDN:
http://msdn.microsoft.com/zh-cn/library/ms188001.aspx
wuyq11 2010-10-20
  • 打赏
  • 举报
回复
set @sql= @sql+ ' order by '+@Order
exec(@sql)
mngzilin 2010-10-20
  • 打赏
  • 举报
回复
完全可以,我在以前回复过这种帖子
newdigitime 2010-10-20
  • 打赏
  • 举报
回复
大家都说了,可以,不过只能拼接了,这样风险大一些.
chai1338 2010-10-20
  • 打赏
  • 举报
回复
只是不想在程序里看见sql语句
种草德鲁伊 2010-10-20
  • 打赏
  • 举报
回复
既然要拼,就放程序里拼,再弄个存储过程也是多此一举。
yan267 2010-10-20
  • 打赏
  • 举报
回复


DECLARE @SecondId NVARCHAR(20)
DECLARE @pagesize NVARCHAR(20)
DECLARE @pageindex NVARCHAR(20)
DECLARE @orderBy NVARCHAR(4000)

SET @SecondId='1'
SET @pagesize='1'
SET @pageindex='1'
SET @orderBy='A'

DECLARE @SQL NVARCHAR(4000)

SET @SQL=' with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY '+@orderBy+')AS Row, * from Products O where secondid='+@SecondId+')
SELECT * FROM temptbl where Row between ('+@pageindex+'-1)*'+@pagesize+'+1 and ('+@pageindex+'-1)*'+@pagesize+'+'+@pagesize+'
'

PRINT @SQL

exec(@SQL)


chai1338 2010-10-20
  • 打赏
  • 举报
回复

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure [dbo].[GetProductsPageByPrice]
(@SecondId Int,
@pagesize int,
@pageindex int)
as

begin
with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY shoujia)AS Row, * from Products O where secondid=@secondid)
SELECT * FROM temptbl where Row between (@pageindex-1)*@pagesize+1 and (@pageindex-1)*@pagesize+@pagesize
end




那帮我把 shoujia 就是order by 这个改成动态的吧
sprc_lcl 2010-10-20
  • 打赏
  • 举报
回复
CREATE PROCEDURE aaaaaaaaaaaaaaaa
@SQL varchar(4000),
@Order varchar(1000)
AS
BEGIN

set @SQL = @SQL + ' order by '+@Order

execute(@SQL)

END
yan267 2010-10-20
  • 打赏
  • 举报
回复
不能直接这样用,除非你用拼写SQL的方式



DECLARE @SQL NVARCHAR(4000)
SET @SQL='SELECT * from table order by ''+@XXX+'''
yhtapmys 2010-10-20
  • 打赏
  • 举报
回复
直接应该不可也
拼接SQL可也
chai1338 2010-10-20
  • 打赏
  • 举报
回复
谢谢。。。。学习了
缪军 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chai1338 的回复:]
只是不想在程序里看见sql语句
[/Quote]

楼主的想法是对的,
数据库读取操作(查询)是千变万化的,应该远离业务代码
种草德鲁伊 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chai1338 的回复:]

只是不想在程序里看见sql语句
[/Quote]

字段名称不就是sql语句的一部分了, 这么弄,也不过是一部分在程序里拼,一部分放到存储过程里拼。

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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