sql server 视图 传参

yangjieai 2010-05-10 10:22:43
不知道视图是不是可以传参进去然后在查询,
比如说我现在有一个视图,但他查询出来的结果不是我想要的, 可不可以从视图外面传入一个条件 到视图里面,然后再根据这个查询条件 得到我所要的答案呢?
...全文
120 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangjieai 2010-05-10
  • 打赏
  • 举报
回复
懂了 谢谢!结账
yangjieai 2010-05-10
  • 打赏
  • 举报
回复
row_number() over (order by SUM(Amount)desc ) 但这个里面的Amount 是从程序传来的 比如说@sql=' sum(Amount)desc' , 放到sql语句里面就成 row_number() over (order by ‘’SUM(Amount)desc ’) 这样了 执行起来报错,请问怎么转换过来
yangjieai 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 htl258 的回复:]
引用 9 楼 yangjieai 的回复:
SQL code


SELECT UserID, SUM(Amount) AS Amount,
(SELECT TOP (1) DisplayName
FROM dbo.RangeAchievements AS b
……


再用row_number() over (order by amount desc ) as taxis 对……
[/Quote]

我弄清楚了 这句是根据amount 进行名次排列
[ code=SQL]
SELECT row_number() over (order by SUM(Amount)desc ) as taxis, UserID, SUM(Amount) AS Amount,
(SELECT TOP (1) DisplayName
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DisplayName,
(SELECT TOP (1) DeptName
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DeptName,
(SELECT TOP (1) HeadPhoto
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS HeadPhoto,
(SELECT TOP (1) DeptID
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DeptID
FROM dbo.RangeAchievements AS a
where CreateTime>
(SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
and
CreateTime
<
(SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) )
GROUP BY UserID
[/code]
htl258_Tony 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangjieai 的回复:]
SQL code


SELECT UserID, SUM(Amount) AS Amount,
(SELECT TOP (1) DisplayName
FROM dbo.RangeAchievements AS b
……
[/Quote]

再用row_number() over (order by amount desc ) as taxis 对结果进行分组统计,

这句看了N遍不解
--小F-- 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangjieai 的回复:]
SQL code


SELECT UserID, SUM(Amount) AS Amount,
(SELECT TOP (1) DisplayName
FROM dbo.RangeAchievements AS b
……
[/Quote]

这个用存储过程恐怕更加合适
yangjieai 2010-05-10
  • 打赏
  • 举报
回复


SELECT UserID, SUM(Amount) AS Amount,
(SELECT TOP (1) DisplayName
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DisplayName,
(SELECT TOP (1) DeptName
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DeptName,
(SELECT TOP (1) HeadPhoto
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS HeadPhoto,
(SELECT TOP (1) DeptID
FROM dbo.RangeAchievements AS b
WHERE (UserID = a.UserID)) AS DeptID
FROM dbo.RangeAchievements AS a
where CreateTime>
(SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
and
CreateTime
<
(SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) )
GROUP BY UserID

我现在要查询这样语句, 上面要传入一个从程序传来的日期, 然后得到查询结果
再用row_number() over (order by amount desc ) as taxis 对结果进行分组统计,输出我想要的结果 ,如果用存储过程怎么弄
喜-喜 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangjieai 的回复:]
引用 2 楼 happycell188 的回复:
不能!那样的话,不就成了存储过程或函数了么!
弱弱的问句 如果我用存储过程,怎么返回 多行数据
[/Quote]

这些内容可以到百度里面找!

不搜不知道,搜了全知道..
htl258_Tony 2010-05-10
  • 打赏
  • 举报
回复
-->SQL查询如下:
IF OBJECT_ID('[fn_test]') IS NOT NULL
DROP FUNCTION [fn_test]
GO
CREATE FUNCTION [fn_test](@参数 varchar(20))
RETURNS TABLE
AS
RETURN
SELECT * FROM [tb] WHERE name like '%'+@参数+'%'
GO

--调用:

SELECT * FROM [fn_test]('县')
/*
id name fid
----------- ---------- -----------
110228 密云县 110200
110229 延庆县 110200

(2 行受影响)
*/
永生天地 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangjieai 的回复:]
引用 2 楼 happycell188 的回复:
不能!那样的话,不就成了存储过程或函数了么!
弱弱的问句 如果我用存储过程,怎么返回 多行数据
[/Quote]
存储过程,最后写select 返回结果集
htl258_Tony 2010-05-10
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-10 10:25:02
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10),[fid] [int])
INSERT INTO [tb]
SELECT '110101','东城区','110100' UNION ALL
SELECT '110102','西城区','110100' UNION ALL
SELECT '110103','崇文区','110100' UNION ALL
SELECT '110104','宣武区','110100' UNION ALL
SELECT '110105','朝阳区','110100' UNION ALL
SELECT '110106','丰台区','110100' UNION ALL
SELECT '110107','石景山区','110100' UNION ALL
SELECT '110108','海淀区','110100' UNION ALL
SELECT '110109','门头沟区','110100' UNION ALL
SELECT '110111','房山区','110100' UNION ALL
SELECT '110112','通州区','110100' UNION ALL
SELECT '110113','顺义区','110100' UNION ALL
SELECT '110114','昌平区','110100' UNION ALL
SELECT '110115','大兴区','110100' UNION ALL
SELECT '110116','怀柔区','110100' UNION ALL
SELECT '110117','平谷区','110100' UNION ALL
SELECT '110228','密云县','110200' UNION ALL
SELECT '110229','延庆县','110200'


-->SQL查询如下:
IF OBJECT_ID('[fn_test]') IS NOT NULL
DROP FUNCTION [fn_test]
GO
CREATE FUNCTION [fn_test](@参数 varchar(20))
RETURNS TABLE
AS
RETURN
SELECT * FROM [tb] WHERE name=@参数
GO

--调用:

SELECT * FROM [fn_test]('西城区')
/*
id name fid
----------- ---------- -----------
110102 西城区 110100

(1 行受影响)
*/
参考
yangjieai 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happycell188 的回复:]
不能!那样的话,不就成了存储过程或函数了么!
[/Quote]弱弱的问句 如果我用存储过程,怎么返回 多行数据
yangjieai 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 htl258 的回复:]
应该是用表值函数
[/Quote] 能详细说一下吗?
喜-喜 2010-05-10
  • 打赏
  • 举报
回复
不能!那样的话,不就成了存储过程或函数了么!
htl258_Tony 2010-05-10
  • 打赏
  • 举报
回复
应该是用表值函数

22,207

社区成员

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

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