C# SqlDataAdapter SelectCommand:将参数传入 TSQL 'execute'

C# SqlDataAdapter SelectCommand: pass in parameter into TSQL 'execute'

从 C# 开始,我想 运行 基于 SQL 服务器版本的 SQL 命令(商业智能)。 所以命令类似于

if newVersion
    SELECT some cool stuff
else
    SELECT some old stuff

由于新版本包含旧 SQL 服务器版本中不可用的功能,我发现唯一的方法是通过 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

我想在通过执行命令执行的 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;