如何在Select语句

时间:2015-06-23 11:33:02

标签: sql sql-server stored-procedures

我正在尝试根据if else

更新存储过程的Where子句
ALTER PROCEDURE spLocal_GetDetails
@Var1 varchar(255),
@Var2 varchar(255)
As
declare @WhereClause varchar(255)
IF @Var1 = '' and @Var2 = ''
SET @WhereClause='Where T1.Key1='+@Var1 
ELSE
SET @WhereClause= 'T1.Key1='+@Var1 + ' and someValue'+ @Var2+' 

Select *
from [dbo].[Table1] T1 
LEFT JOIN [dbo].[Table2] T2 with(nolock) on T1.KEY=T2.KEY
+ @WhereClause

现在我收到了错误:

  

Msg 245,Level 16,State 1,Procedure spLocal_GetDetails,   将varchar值'Where T1.Key1 = 5'转换为数据类型int。

时转换失败

4 个答案:

答案 0 :(得分:2)

我倾向于不喜欢生成动态SQL(here's why),在这样一个相当简单的情况下,我会选择以下内容......

ALTER PROCEDURE spLocal_GetDetails
     @Var1 varchar(255),
     @Var2 varchar(255)
As
    declare @BothKeysEmpty bit

    IF @Var1 = '' and @Var2 = ''
        SET @BothKeysEmpty = 1
    ELSE
        SET @BothKeysEmpty = 0

    select *
      from [dbo].[Table1] T1 
      left join [dbo].[Table2] T2 with(nolock) on T1.KEY=T2.KEY
     where T1.Key1= @Var1
       and (@BothKeysEmpty = 1 OR somevalue = @Var2)

答案 1 :(得分:1)

您的代码中存在三个问题。

首先:

SET @WhereClause='Where T1.Key1='+@MyId

@Id似乎是一个整数。这意味着它应该被转换!

SET @WhereClause='Where T1.Key1='+CONVERT(nvarchar(100),@MyId)

第二

你从哪里得到@MyId?我在你的代码中没有看到它。

第三名:

SET @WhereClause= 'T1.Key1='+@MyId+ ' and someValue'+ @Var1+' and otherValue='+ @Var2

您尝试在where子句中放入一个字符串。您忘记了=,并且需要使用''将它们标记为字符串。见这里:

SET @WhereClause= 'T1.Key1='+CONVERT(nvarchar(100),@MyId)+ ' and someValue='''+ @Var1+''' and otherValue='''+ @Var2 + ''''

答案 2 :(得分:0)

这是在sqlserver

中运行的
ALTER PROCEDURE spLocal_GetDetails
@Var1 varchar(255),
@Var2 varchar(255)
As
begin
declare @WhereClause varchar(255)
declare @query varchar(max)
IF @Var1 = '' and @Var2 = ''
SET @WhereClause='Where T1.Key1='+convert(varchar(50),@MyId)
ELSE
SET @WhereClause= 'where T1.Key1='+convert(varchar(50),@MyId)+ ' and someValue'+ @Var1+' and otherValue='+ @Var2

SET @query='Select *
from [dbo].[Table1] T1 
LEFT JOIN [dbo].[Table2] T2 with(nolock) on T1.KEY=T2.KEY '
+ @WhereClause

excute(@query)
end

答案 3 :(得分:0)

你正在混合使用sql和t-sql,你应该通过创建一个temp变量来动态构建一个查询,该变量将保存你的sql然后通过t-sql执行它

SET @query='
Select *
from [dbo].[Table1] T1 
LEFT JOIN [dbo].[Table2] T2 with(nolock) on T1.KEY=T2.KEY
'
+ @WhereClause

excute(@query)