2015-06-23 53 views
1

我试图更新基于if else如何附加SQL字符串在SELECT语句

ALTER PROCEDURE spLocal_GetDetails 
@Var1 varchar(255), 
@Var2 varchar(255) 
As 
declare @WhereClause varchar(255) 
IF @Var1 = '' and @Var2 = '' 
SET @WhereClause='Where T1.Key1='[email protected] 
ELSE 
SET @WhereClause= 'T1.Key1='[email protected] + ' and someValue'+ @Var2+' 

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

现在我得到的错误存储过程的WHERE子句:

Msg 245, Level 16, State 1, Procedure spLocal_GetDetails, Conversion failed when converting the varchar value 'Where T1.Key1=5' to data type int.

+2

请仔细阅读本文。 http://www.sommarskog.se/dynamic_sql.html – Jeremy

+0

我在下面添加了我的答案。但无论如何,代码并不是很好,应该真正改进。 – Ionic

回答

1

有三种您的代码中存在问题。

首先:

SET @WhereClause='Where T1.Key1='[email protected] 

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

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

二:

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

;第三:

SET @WhereClause= 'T1.Key1='[email protected]+ ' and someValue'+ @Var1+' and otherValue='+ @Var2 

你试图将一个字符串的where子句。您忘记了=,您需要使用''将它们标记为字符串。在这里看到:

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

此解决方案不完整。 OP试图将where子句连接到非动态查询,这将失败。 – Jeremy

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 
+0

此解决方案中存在语法错误。 – Jeremy

+0

现在它是检查仍然得到错误给出的错误 –

0

您希望通过创建一个临时变量,它把你的SQL,然后执行混合SQL和T-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) 
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)