到目前为止,我有一个像这样的 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
变量中没有正确连接或格式化。
乐于接受任何建议。
编辑:我的存储过程目前看起来像这样:
当我执行存储过程时,它返回了我想要的结果集,但它也显示了一条错误消息:
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/