2016-11-04 17 views
0

私は、文字列の後に「Unclosed quotation mark」というエラーが表示されるストアドプロシージャを持っています。私のコードで何が間違っているかを知るのを助けてください。文字列の後に「Unclosed quotation markを表示している動的クエリ」)、

ここは私のコードです。

ALTER PROCEDURE [dbo].[usp_Transfer] 
@orgid bigint, 
@SearchString nvarchar (500) = null, 
@LocationId bigint = 0, 
@ownerid bigint, 
@OrderList varchar(MAX) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements.\ 
SET NOCOUNT ON; 
DECLARE @SQL varchar(MAX) 
BEGIN 
    SET @SQL = 'SELECT ProductID = ii.ProductId, 
    InvItemId = convert(bigint,0),Name = p.Name, 
     PrimaryImageID = p.PrimaryImageID,ProductNumberLabel = p.ProductNumberLabel,ProductNumber = p.ProductNumber, 
     category = isnull(c.Name,''), 
     qty = ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00), 
     SalePrice= ISNULL(p.SalePrice, 0.00), 
     EnteredQuantity=(case when (ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00) > 1) then 1.00 else ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00) end) 
     ,Discount=0,u.UnitName, 
     u.UnitID 

    FROM dbo.[Inven] ii 

    Left Join dbo.[Product] p on ii.ProductId = p.ProductId and p.activestatus=1 

    Left Join dbo.[category] c on p.DefaultCategoryId = c.CategoryId 

    Left Join dbo.[Unit] u on p.UnitId=u.UnitId and u.Activestatus=1 

    WHERE p.OrganizationID = @orgid 
    AND ii.InventoryID IN(1634) 
    AND ii.ActiveStatus = 1 
    AND p.ActiveStatus = 1 
    AND p.IsDisabled = 0 
    And p.CanSale = 1 
    AND ii.InventoryID IN (' + @OrderList + ') 

    group by ii.ProductId, p.Name, p.PrimaryImageID, p.ProductNumberLabel, p.ProductNumber, c.Name,p.SalePrice,u.unitname,u.UnitID 
    having ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0) > 0 
    Order by p.ProductNumber, p.Name, c.Name ' 
    --EXEC(@SQL) 
    PRINT(@SQL) 
END 
END 
+0

非常に多くのエラーは、引用符のようなものを解決するための変数@orgidを宣言して、変換エラー –

答えて

1

更新以下のようにあなたのSP:

注:引用符のようなものを解く場合は非常に多くのエラーがある、宣言これらの記事は、あなたがそのセクションを手直しに役立つかもしれません変数@orgidと変換エラー

category = isnull(c.Name,'')の初期エラーは、012と置き換えてください

alter PROCEDURE [dbo].[usp_Transfer] 
@orgid bigint=1, 
@SearchString nvarchar (500) = null, 
@LocationId bigint = 0, 
@ownerid bigint=1, 
@OrderList varchar(MAX)='1' 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements.\ 
SET NOCOUNT ON; 
DECLARE @SQL varchar(MAX) 
BEGIN 
    SET @SQL = 'SELECT ProductID = ii.ProductId, 
    InvItemId = convert(bigint,0),Name = p.Name, 
     PrimaryImageID = p.PrimaryImageID,ProductNumberLabel = p.ProductNumberLabel,ProductNumber = p.ProductNumber, 
     category = isnull(c.Name,''''), 
     qty = ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00), 
     SalePrice= ISNULL(p.SalePrice, 0.00), 
     EnteredQuantity=(case when (ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00) > 1) then 1.00 else ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0.00) end) 
     ,Discount=0,u.UnitName, 
     u.UnitID 

    FROM dbo.[Inven] ii 

    Left Join dbo.[Product] p on ii.ProductId = p.ProductId and p.activestatus=1 

    Left Join dbo.[category] c on p.DefaultCategoryId = c.CategoryId 

    Left Join dbo.[Unit] u on p.UnitId=u.UnitId and u.Activestatus=1 

    WHERE p.OrganizationID = '+CAST(@orgid AS VARCHAR(10))+' 
    AND ii.InventoryID IN(1634) 
    AND ii.ActiveStatus = 1 
    AND p.ActiveStatus = 1 
    AND p.IsDisabled = 0 
    And p.CanSale = 1 
    AND ii.InventoryID IN (' + @OrderList + ') 

    group by ii.ProductId, p.Name, p.PrimaryImageID, p.ProductNumberLabel, p.ProductNumber, c.Name,p.SalePrice,u.unitname,u.UnitID 
    having ISNULL((SUM(ii.[QuantityOnHand]) - SUM(ii.[QuantitySold])), 0) > 0 
    Order by p.ProductNumber, p.Name, c.Name ' 
    EXEC(@SQL) 
    PRINT(@SQL) 
END 
END 
2

2つの注意点。

まず、@OrderListに引用符が含まれていますか?

第二に、この行:

...' WHERE p.OrganizationID = @orgid ' 

は次のようになります。

....'WHERE p.OrganizationID = ' + @orgid + '...' 

これらのいずれかが問題の原因であるかどうかをテストするための簡単な方法は、両方のアウトをコメントすることで、それを実行し、それがうまくいくかどうか確認してください。

最後に、このクエリを書き換えて動的クエリをまったく使用しないようにすることができます。私はあなたがIN (' + @OrderList + ')句のためにそれをしたクエリを見ていると思います。

Parameterize an SQL IN clause

SQL Server - In clause with a declared variable

+1

場合、私は、連結文字列からSQLを構築するなどの固体助言を数えることはないと思うがあります。 OPはパラメータを使用する必要がありますが、[sp_executesql](https://msdn.microsoft.com/en-us/library/ms188001.aspx)で行うことは難しくありません。そのため、何も言い訳がありません。 – Tomalak

+2

@Tomalak yeh trueしかし、私は彼にそれをするように勧めていないと同時に、私は彼に知らせなかった。私は提供されたコードを使って作業していましたが、私は余裕を持って簡単なアドバイスを提供しようとしていました。私は推薦で更新します。 – Tanner

関連する問題