[英]SQL Stored Procedure WHERE CLAUSE Variable
I have a stored procedure and I cant work out how the string is meant to be built up. 我有一个存储过程,我无法弄清楚字符串是如何构建的。
The SQL statement works fine when I do not have a variable in there so it is definitely the way I am writing it in. I am just a beginner so unsure about the syntax. 当我没有变量时,SQL语句工作正常,所以它绝对是我写它的方式。我只是一个初学者,对语法不太了解。
Here is the code: 这是代码:
CREATE PROCEDURE [dbo].[SP_SLINVOICE]
@varCURRENCY AS VARCHAR(3)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = N'SELECT dbo.invmaster.InvNumber
FROM dbo.invmaster INNER JOIN dbo.invdetail ON dbo.invmaster.INVMasterID = dbo.invdetail.INVMasterID
INNER JOIN dbo.Company ON dbo.invmaster.InvCompanyID = dbo.Company.CompanyID
WHERE dbo.InvMaster.InvCurrency = '' + @varCURRENCY + ''
AND dbo.invmaster.DocType <> ''MC''
ORDER BY dbo.invmaster.InvNumber ASC;';
EXEC sp_executesql @sql;
The @varCURRENCY does not give me an error when i execute. 执行时@varCURRENCY不会给我一个错误。 But it does not work either when i pass it through a parameter. 但是,当我通过参数传递它时,它不起作用。
Please let me know if you can see what the issue is. 如果您能看到问题所在,请告诉我。
Thanks in advance 提前致谢
Your SQL is ending up like this: 您的SQL最终结果如下:
WHERE dbo.InvMaster.InvCurrency = '@varCURRENCY'
So you are not looking for the value of the parameter, you are looking for @Currency
, I am not sure why you are using Dynamic SQL, the following should work fine: 所以你不是在寻找参数的值,你正在寻找@Currency
,我不确定你为什么使用动态SQL,以下应该可以正常工作:
CREATE PROCEDURE [dbo].[SP_SLINVOICE] @varCURRENCY AS VARCHAR(3)
AS
BEGIN
SET NOCOUNT ON;
SELECT dbo.invmaster.InvNumber
FROM dbo.invmaster
INNER JOIN dbo.invdetail
ON dbo.invmaster.INVMasterID = dbo.invdetail.INVMasterID
INNER JOIN dbo.Company
ON dbo.invmaster.InvCompanyID = dbo.Company.CompanyID
WHERE dbo.InvMaster.InvCurrency = @varCURRENCY
AND dbo.invmaster.DocType <> 'MC'
ORDER BY dbo.invmaster.InvNumber ASC;
END
If you need Dynamic SQL for some other reason you can use the following to pass @varCURRENCY
as a parameter to sp_executesql
: 如果由于某些其他原因需要动态SQL,可以使用以下命令将@varCURRENCY
作为参数传递给sp_executesql
:
DECLARE @SQL NVARCHAR(MAX);
SELECT @SQL = N'SELECT dbo.invmaster.InvNumber
FROM dbo.invmaster INNER JOIN dbo.invdetail ON dbo.invmaster.INVMasterID = dbo.invdetail.INVMasterID
INNER JOIN dbo.Company ON dbo.invmaster.InvCompanyID = dbo.Company.CompanyID
WHERE dbo.InvMaster.InvCurrency = @varCURRENCY
AND dbo.invmaster.DocType <> ''MC''
ORDER BY dbo.invmaster.InvNumber ASC;';
EXEC sp_executesql @sql, N'@varCURRENCY VARCHAR(3)', @varCURRENCY;
If you want to pass a variable to an sp_executesql
context, you need to pass it as a parameter. 如果要将变量传递给sp_executesql
上下文,则需要将其作为参数传递。
EXECUTE sp_executesql
@sql,
N'@varCurrency varchar(3)',
@varcurrency= @varCurrency;
http://msdn.microsoft.com/en-gb/library/ms188001.aspx http://msdn.microsoft.com/en-gb/library/ms188001.aspx
Although why you don't just use 虽然为什么你不只是使用
select ... where dbo.InvMaster.InvCurrency = @varCURRENCY
instead of the executesql is beyond me. 而不是executeql超出了我。
You need to pass @varCURRENCY
as a parameter, Remove extra '
from your Sp. 您需要传递@varCURRENCY
作为参数,从Sp中删除额外的'
。
WHERE dbo.InvMaster.InvCurrency = ' + @varCURRENCY + '
Or do not use dynamic query 或者不要使用动态查询
CREATE PROCEDURE [dbo].[SP_SLINVOICE]
@varCURRENCY AS VARCHAR(3)
AS
BEGIN
SET NOCOUNT ON;
SELECT dbo.invmaster.InvNumber
FROM dbo.invmaster INNER JOIN dbo.invdetail ON dbo.invmaster.INVMasterID = dbo.invdetail.INVMasterID
INNER JOIN dbo.Company ON dbo.invmaster.InvCompanyID = dbo.Company.CompanyID
WHERE dbo.InvMaster.InvCurrency = @varCURRENCY
AND dbo.invmaster.DocType <> 'MC'
ORDER BY dbo.invmaster.InvNumber ASC;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.