0

データ型について質問があります。次のコード行は、データベースで機能します。

WHERE e_ru IN (5420,5410,5550,6230,6240,6250)

e_ruここで、月ごとに異なる数字のセットを挿入したいと思います。

DECLARE @StartDate DATETIME, @EndDate DATETIME, @MonthOfYear TINYINT, @RUsToAudit NVARCHAR
SET @StartDate = (dateadd(month, datediff(month, 0, DATEADD(month, -6, GETDATE())),0)+15)
SET @EndDate = (dateadd(month, datediff(month, 0, DATEADD(month, 0, GETDATE())),0)+14)
SET @MonthOfYear = DATEPART(month, GETDATE())
SET @RUsToAudit =
CASE
WHEN @MonthOfYear = 1 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 2 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 3 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 4 THEN (SELECT 5460,5470,5500)
WHEN @MonthOfYear = 5 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 6 THEN (SELECT 5530,5910)
WHEN @MonthOfYear = 7 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 8 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 9 THEN (SELECT 5460,5470,5500)
WHEN @MonthOfYear = 10 THEN (SELECT 5420,5410,5550,6230,6240,6250)
WHEN @MonthOfYear = 11 THEN (SELECT 5530,5910)
WHEN @MonthOfYear = 12 THEN (SELECT 5420,5410,5550,6230,6240,6250)
END
SELECT          @StartDate AS 'Report Start Date', @EndDate AS 'Report End Date', @MonthOfYear AS 'Month', @RUsToAudit AS 'Programs'
4

2 に答える 2

1

この情報を保存するために、データベースに永続的なテーブルを作成することをお勧めします。具体的には、MonthNumber と ListItem (両方とも整数) を含むテーブルを作成し、Hogan が提案するクエリを使用します。

私には、(現在) ビジネス ルールをデータベースにハード コーディングしているように見えます。これらの値を別のテーブルに分けることで、コードに飛び込んで変更を加える代わりに、テーブル内のデータを変更することで機能を簡単に変更できます。

これは、セットアップにもう少し時間がかかる場合がありますが、長期的には (ビジネス プロセスが変化するにつれて)、より洗練されたソリューションになります。

于 2013-10-24T16:34:49.880 に答える
0

たとえば、これは機能しますが、おそらくあなたが望むものとはまったく異なります-正しいデータモデルを作成するために何をしようとしているのかを知る必要があります

WITH dataTable AS
(
   SELECT 1 AS Month,  '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 2  AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL 
   SELECT 3  AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 4  AS Month, '5460,5470,5500' AS List
UNION ALL
   SELECT 5  AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 6  AS Month, '5530,5910' AS List
UNION ALL
   SELECT 7  AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 8  AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 9  AS Month, '5460,5470,5500' AS List
UNION ALL
   SELECT 10 AS Month, '5420,5410,5550,6230,6240,6250' AS List
UNION ALL
   SELECT 11 AS Month, '5530,5910' AS List
UNION ALL
   SELECT 12 AS Month, '5420,5410,5550,6230,6240,6250' AS List
)
SELECT @RUsToAudit = List
FROM dataTable WHERE Month = @MonthOfYear

IN()これを別の選択の一部として使用する予定がある場合は、次のようにします。

WITH dataTable AS
(
   SELECT 1 AS Month, 5420 as ID
 UNION ALL
   SELECT 1 AS Month, 5410 as ID
 UNION ALL
   SELECT 1 AS Month, 5550 as ID
 UNION ALL
   SELECT 1 AS Month, 6230 as ID
 -- etc
)
SELECT * 
FROM table
JOIN dataTable on table.ID = dataTable.ID AND dataTable.Month = @MonthOfYear

また

SELECT *
FROM table
WHERE table.ID IN (SELECT ID from dataTable WHERE dataTable.Month = @MonthOfYear)

IN の内容を持つ文字列変数を持つことは機能しません。

于 2013-10-24T15:28:15.957 に答える