我正在尝试根据if else
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。
时转换失败
答案 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)