1

私は関数が必要ですが、それを正しく取得できないようです。ここや他の場所で例を見てきましたが、これを正しく取得できないようです。クエリにオプションの項目を含める必要があります。このクエリがあります (これは機能します) ):

SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
(1000),Description)) AS LenDesc FROM tblItem
WHERE Title = @Title AND Manufacturer = @Manufacturer
ORDER BY LenDesc DESC

これは関数内で機能しますが、この検索で​​は製造元はオプションです。これは、同様のアイテムの説明を見つけることです。何も存在しない場合、他のクエリは次のようになります。

SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
(1000),Description)) AS LenDesc FROM tblItem
WHERE Title = @Title ORDER BY LenDesc DESC

製造元が欠落しています。製造元の値が存在するかどうかに基づいて、関数を使用してクエリを使用する方法を教えてください。その理由は、最初に SKU の説明をチェックし、それが存在しない場合は、このメソッドを使用して類似製品から説明を取得し、類似製品の説明で追加される製品を更新する関数を用意するためです。

これまでの機能は次のとおりです。

ALTER FUNCTION [dbo].[GetDescriptionByTitleManufacturer]
(   
    @Title varchar(400),
    @Manufacturer varchar(160)
)
RETURNS TABLE 
AS
RETURN (
    SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
    (1000),Description)) AS LenDesc FROM tblItem
    WHERE Title = @Title AND Manufacturer = @Manufacturer
    ORDER BY LenDesc DESC
    )

BEGIN と IF...ELSE を追加しようとしましたが、試行するたびにエラーや構文の問題が発生します。この疑似関数のようなことを実行できるようにしたい (これは機能しません)。

ALTER FUNCTION [dbo].[GetDescriptionByTitleManufacturer]
(   
    @Title varchar(400),
    @Manufacturer varchar(160)
)
RETURNS TABLE 
AS
BEGIN
IF (@Manufacturer = Null)
RETURN (
    SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
    (1000),Description)) AS LenDesc FROM tblItem
    WHERE Title = @Title ORDER BY LenDesc DESC
    )
ELSE
RETURN (
    SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
    (1000),Description)) AS LenDesc FROM tblItem
    WHERE Title = @Title AND Manufacturer = @Manufacturer
    ORDER BY LenDesc DESC
    )

終わり

4

3 に答える 3

4

このようなことができますか?

ALTER FUNCTION [dbo].[GetDescriptionByTitleManufacturer]
(   
    @Title varchar(400),
    @Manufacturer varchar(160)
)
RETURNS TABLE 
AS
RETURN (
    SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
    (1000),Description)) AS LenDesc FROM tblItem
    WHERE Title = @Title AND (@Manufacturer IS NULL OR Manufacturer = @Manufacturer)
    ORDER BY LenDesc DESC
    )
于 2010-04-01T10:08:48.037 に答える
1

これを行うAND (Manufacturer = @Manufacturer OR @Manufacturer IS NULL)と、インデックスの使用がなくなります。動的検索には多くの微妙なパフォーマンスへの影響があります。Erland Sommarskog による T-SQL の動的検索条件を読む必要があります。

適切な SQL Server 2008 バージョン (SQL 2008 SP1 CU5 (10.0.2746) 以降) を使用している場合は、この小さなトリックを使用して実際にインデックスを使用できます。

. OPTION (RECOMPILE)_ _ _ OR_ (@Manufacturer IS NULL OR Manufacturer = @Manufacturer)_

ALTER FUNCTION [dbo].[GetDescriptionByTitleManufacturer]
(   
    @Title varchar(400),
    @Manufacturer varchar(160)
)
RETURNS TABLE 
AS
RETURN
(SELECT TOP 100 
     PERCENT SKU, Description, LEN(CONVERT(VARCHAR(1000),Description)) AS LenDesc 
     FROM tblItem
         WHERE Title = @Title 
         AND (@Manufacturer IS NULL OR Manufacturer = @Manufacturer)
     ORDER BY LenDesc DESC
     OPTION (RECOMPILE) ---<<<<only valid for SQL 2008 SP1 CU5 (10.0.2746) and later
)
GO
于 2010-04-01T11:31:07.317 に答える
0

メーカーが適用しない場合は、NULL を使用してみてください。

SELECT TOP 100 PERCENT SKU, Description, LEN(CONVERT(VARCHAR
(1000),Description)) AS LenDesc FROM tblItem
WHERE Title = @Title AND (Manufacturer = @Manufacturer OR @Manufacturer IS NULL)
ORDER BY LenDesc DESC
于 2010-04-01T10:10:52.183 に答える