问题描述
从C#开始,我想基于sql Server版本运行sql命令(商业智能)。 所以命令就像
if newVersion
SELECT some cool stuff
else
SELECT some old stuff
由于新版本包含旧sql Server版本中不提供的功能,所以我发现这样做的唯一方法是通过Tsql中的execute函数
if newVersion
execute('new SELECT')
else
execute ('old SELECT')
到目前为止一切顺利。
我还想传递一个参数-实际上是一个DateTime,它将作为SELECT的WHERE子句的一部分。
为了使事情变得更加有趣,我将通过sqlDataAdapter从C#代码传递DateTime @StartDate,该sqlDataAdapter将.net字符串语句作为Tsql文本传递到SelectCommand并调用Fill。像
adapter.SelectCommand = new sqlCommand(statement,con);
adapter.SelectCommand.Parameters.Add(myStartDate);
adapter.Fill(ds,resultTableName);
但是..对于我一生来说,我无法将其放入sql进行工作。调用Fill方法(执行代码)时,总是会收到一些语法错误异常。
传递参数(不传递动态sql)以及将参数硬编码到动态sql中都是可行的。但不是组合。
我的sql(仅用于测试)看起来像
EXECUTE('SELECT ''' + @MyStartDate + '''
')
在这里我尝试将参数转换为要在服务器上执行的sql命令文本的一部分。
我明白了
System.Data.sqlClient.sqlException: Incorrect Syntax near SELECT
我想在通过execute命令执行的SQL查询中使用从C#添加的参数。
解决方法
正如我在评论中所说,在使用动态SQL时不要使用EXEC ({SQL Statement/Variable})
,而应使用可以参数化的sys.sp_executesql
。
我们这里没有任何实际的示例代码,因此,我将使用您过于简化的语句,即:
DECLARE @StartDate date = GETDATE();
DECLARE @SQL nvarchar(MAX) = N'SELECT @StartDate;';
EXEC sys.sp_executesql @SQL,N'@StartDate date',@StartDate = @StartDate;