c# - 如何将字符串传入存储过程中的动态sql

标签 c# sql sql-server validation stored-procedures

到目前为止,我有一个像这样的 SQL 语句:

SELECT 
    y.ID, y.STATUS, y.CONTROLID, y.TRCDE
FROM 
    YTDTRNI AS y 
LEFT JOIN 
    VND AS v ON y.COMNO = v.COMNO 
WHERE 
    TRCDE ='RC' 
ORDER BY 
    ID DESC

我正在尝试在使用动态 SQL 的存储过程中使用此查询。到目前为止,我的存储过程如下所示:

SET @query =  N'SELECT y.ID, y.STATUS, y.CONTROLID, y.TRCDE
                FROM YTDTRNI AS y LEFT JOIN VND AS v ON y.COMNO = v.COMNO 
                WHERE TRCDE = ' + @searchtrtype + ' 
                ORDER BY ' + @orderbycondition

变量@searchtrtype@orderbycondition 的类型是nvarchar

我正在使用 ASP.NET/C# 程序来调用存储过程。但是,它因异常而中断:

An expression of non boolean type in a context where a condition is expected near 'ORDER'

我想我收到错误是因为字符串值在 @query 变量中没有正确连接或格式化。

乐于接受任何建议。

编辑:我的存储过程目前看起来像这样:

enter image description here

当我执行存储过程时,它返回了我想要的结果集,但它也显示了一条错误消息:

Must declare the scalar variable "@dsearchtrtype".

我尝试在 BEGIN 主体内声明它并将其声明为存储过程参数的一部分,但它仍然显示相同的消息。

最佳答案

学习在 sp_executesql 中使用参数。您可以为 @searchtrtype 执行此操作,但不能为 @orderbycondition 执行此操作:

SET @query =  N'
SELECT y.ID, y.STATUS,y.CONTROLID,y.TRCDE
FROM YTDTRNI y LEFT JOIN
     VND v
     ON y.COMNO = v.COMNO 
WHERE TRCDE = @searchtrtype 
ORDER BY @orderbycondition';

SET @query = REPLACE(@query, '@orderbycondition', @orderbycondition);

EXEC sp_executesql @query,
                   N'@searchtrtype NVARCHAR(255)',   -- or whatever the right type is
                   @searchtrtype=@searchtrtype;

您不能传入标识符,只能传入值,因此这不适用于 @orderbycondition

关于c# - 如何将字符串传入存储过程中的动态sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208351/

相关文章:

sql - 在哪里可以找到 SQL 和 PLSQL 的引用手册

sql-server - SQL Server 2016 Management Studio - 缺少 'Edit top 200' 选项

sql - 关键字 'ORDER' 附近的语法不正确

c# - 从 Razor View 中的 foreach 局部 View 获取数据

c# - 是否收集了不安全的 C# 垃圾

C# DateTimePicker DataBinding Parse 事件不工作

mysql - SQL,是否分隔一列?

c# - 处理具有重复逻辑的冗余代码的最佳方法?

mysql - 如何计算 mysql 中过去 7 天的每一天的条目?

sql-server - 有没有办法检索已在 MS SQL Server Management Studio 的事务中定义的现有保存点列表