繁体   English   中英

SQL存储过程WHERE CLAUSE变量

[英]SQL Stored Procedure WHERE CLAUSE Variable

我有一个存储过程,我无法弄清楚字符串是如何构建的。

当我没有变量时,SQL语句工作正常,所以它绝对是我写它的方式。我只是一个初学者,对语法不太了解。

这是代码:

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;

执行时@varCURRENCY不会给我一个错误。 但是,当我通过参数传递它时,它不起作用。

如果您能看到问题所在,请告诉我。

提前致谢

您的SQL最终结果如下:

WHERE   dbo.InvMaster.InvCurrency = '@varCURRENCY'

所以你不是在寻找参数的值,你正在寻找@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

如果由于某些其他原因需要动态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;

如果要将变量传递给sp_executesql上下文,则需要将其作为参数传递。

EXECUTE sp_executesql 
          @sql,
          N'@varCurrency varchar(3)',
          @varcurrency= @varCurrency;

http://msdn.microsoft.com/en-gb/library/ms188001.aspx

虽然为什么你不只是使用

select ...  where dbo.InvMaster.InvCurrency = @varCURRENCY 

而不是executeql超出了我。

您需要传递@varCURRENCY作为参数,从Sp中删除额外的'

WHERE dbo.InvMaster.InvCurrency = ' + @varCURRENCY + '

或者不要使用动态查询

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM