【发布时间】:2021-01-30 22:50:43
【问题描述】:
使用 C#,我想运行基于 SQL Server 版本的 SQL 命令(商业智能)。 所以命令类似于
if newVersion
SELECT some cool stuff
else
SELECT some old stuff
由于新版本包含旧 SQL Server 版本中不可用的功能,我发现这样做的唯一方法是通过 TSQL 中的执行函数
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#添加的参数。
【问题讨论】:
-
不要使用
EXEC ({SQL Statement})你不能参数化语句。对sys.sp_executesql使用参数化调用。
标签: c# tsql sqldataadapter