仅在代码

时间:2015-06-18 10:22:56

标签: sql-server

我有一个动态的SQL下面

Declare @Sql varchar(max)
Set @Sql = 'select... where c='+@param+' and d=d' //some sql text more than varchar(4000)

当我使用代码执行像这样的SQL

string text = @
' Declare @Sql varchar(max)
  Set @Sql = 'select... where c='+@param+' and d=d' //some sql text more than varchar(4000)'

SqlCommand command = new SqlCommand();
command.CommandType = CommandType.Text;
command.CommandText = text
command.Parameters.Add(new SqlParameter("@param","'strParam'"));
command.ExecuteNonQuery();//get error here.error is 'An expression of non-boolean type specified in a context where a condition is expected, near 'jok_a'.

似乎动态sql在set语句中被截断了。

我在线搜索并知道在这种情况下连接字符串时会发生隐式转换,这会导致varchar(8000) varchar(4000)。他们建议我将varchar(8000)更改为varchar(max),但仍会收到错误。

我不喜欢使用像@sql=@sql(4000 part) +'...'(rest part)这样的东西。如果我只是想调整sql,还有另一种解决方法吗?

2 个答案:

答案 0 :(得分:1)

请尝试这样:

此处不需要DECLARESET,只需删除它并仅使用 SELECT 语句。

string text = @"select... where c=" + @param + " and d = d";

答案 1 :(得分:0)

也许你的@param是varchar(4000)?您需要在连接中包含至少一个带有(max)的变量。

例如

Declare @Sql varchar(max)
set @Sql = ''
Set @Sql = @Sql + 'select... where c='+@param+' and d=d' //some sql text more than varchar(4000)