如何从参数中设置的表中选择列

时间:2012-04-23 12:17:35

标签: sql-server-2008 tsql

我在我的一个项目中使用以下程序。

create procedure [dbo].[SMSStudentSelect2]
@Sorp char(20)
as
begin
   select @Sorp PhoneNo from Students 
   where DATALENGTH(@Sorp) = 11 and ClassId = 1 
   and GRNo not in(select GRNo from Discharge)
end

我的问题是:当我将SPhoneNo放入参数@Sorp时,当我直接使用SPhoneNo时,我得不到任何结果,即我使用像

这样的查询
select SPhoneNo from Students where DATALENGTH(SPhoneNo) = ......... 

在我的程序中,我得到了令人失望的结果

任何人都可以解决我的问题????

4 个答案:

答案 0 :(得分:3)

编辑根据评论来确定OP想要的内容:

尝试这样的事情:

create procedure [dbo].[SMSStudentSelect2]
@Sorp char(1) --"S" returns the SPhoneNo, "P" returns the PPhoneNo
as
begin
   select
       CASE
           WHEN @Sorp='S' THEN SPhoneNo 
           ELSE PPhoneNo 
       END AS PhoneNo
       from Students 
       where DATALENGTH(@Sorp) = 11 and ClassId = 1 
           and GRNo not in(select GRNo from Discharge)
end

传入“S”或“P”以获得所需的列。

答案 1 :(得分:0)

你错过了这里的=符号:

select @Sorp = PhoneNo

答案 2 :(得分:0)

谢谢KM。正如Mikael Eriksson建议的那样我也使用了数据长度的情况。我的问题解决如下

alter procedure [dbo].[SMSStudentSelect2]
@Sorp char(1) --"S" returns the SPhoneNo, "P" returns the PPhoneNo
as
begin
   select
       CASE
           WHEN @Sorp='S' THEN SPhoneNo 
           ELSE PPhoneNo 
       END AS PhoneNo
       from Students 
       where DATALENGTH(case when @Sorp = 'S' then SPhoneNo else PPhoneNo end)= 11 and ClassId = 1 
           and GRNo not in(select GRNo from Discharge)
end
GO

我很遗憾能够奖励你接受答案时获得奖励的唯一声誉

答案 3 :(得分:0)

您可以编写此存储过程以使用动态SQL。

创建程序[dbo]。[SMSStudentSelect2] @Sorp char(20) 如 开始

DECLARE @SQL AS nvarchar(max)=

'select'+ @Sorp +'AS PhoneNo来自学生    其中'+ LENGTH(@Sorp)+'= 11,ClassId = 1    和GRNo不在(从放电中选择GRNo)'

EXEC(@sql)

这不是最快的代码,但会返回您期望的结果。