1

たとえば、この例を説明として取り上げると、Î が何をしようとしているのかがわかります。

これは、ピボットされた情報の最終的なテーブルがどのように見えるかです.

Create Table [#Comparative]
(
    Branch char(32),
    [2004_January] numeric (18,2),
    [2005_January] numeric (18,2),
    [2006_January] numeric (18,2),
    [2007_January] numeric (18,2),
    [2008_January] numeric (18,2),
)


INSERT INTO [#Comparative]
VALUES ('Angeles', NULL, 13550.20, 7820.50, NULL, NULL),
       ('Detroit', NULL, 13550.20, 7820.50, NULL, NULL),
       ('New York', NULL, 13550.20, 7820.50, NULL, NULL),
       ('Arizona', NULL, 13550.20, 7820.50, NULL, NULL)

Select * from [#Comparative]

NULL 値のみを含む列のセットを削除するプロシージャまたはステートメントを作成するにはどうすればよいですか選択した日付の間隔に応じて毎月。

4

2 に答える 2

1

SQL ステートメントを動的に作成し、そのコマンドを実行します。このスクリプトは、一時テーブル (SP でパラメーターとして渡される) から null 値のみを持つ列のセットを削除します。

CREATE PROC dbo.dropColumn
@tempTableName nvarchar(100)
AS
BEGIN
  DECLARE @dml nvarchar(max) = N''
  SELECT @dml += 'IF (SELECT MIN(' + QUOTENAME(c.name) + ') FROM [dbo].' + QUOTENAME(@tempTableName) + ') IS NULL' + CHAR(13) + CHAR(10) +
                 'BEGIN' + CHAR(13) + CHAR(10) +
                 '  EXEC (''ALTER TABLE [dbo].' + QUOTENAME(@tempTableName) + ' DROP COLUMN ' + QUOTENAME(c.name) + ''')' + CHAR(13) + CHAR(10) +
                 'END' + CHAR(13) + CHAR(10)
  FROM tempdb.sys.tables t JOIN tempdb.sys.columns c ON t.object_id = c.object_id
  WHERE t.object_id = OBJECT_ID('[tempdb].[dbo].' + QUOTENAME(@tempTableName))
  --PRINT @dml

  EXEC sp_executesql @dml
END

EXEC dbo.dropColumn '#Comparative'

結果:

Branch                              2005_January    2006_January
----------------------------------------------------------------
Angeles                             13550.20        7820.50
Detroit                             13550.20        7820.50
New York                            13550.20        7820.50
Arizona                             13550.20        7820.50
于 2013-05-02T09:54:41.983 に答える
0

これを試してください: これは一例です。

CREATE ストアド プロシージャ。

CREATE PROCEDURE TestSP
(
    @IsDroped BIT       
)AS
BEGIN

    declare @test int
    declare @testcount int
    set @testcount = (select COUNT(*) from mtp )

    set @test = (select distinct 1 from mtp where name is null  group by name having COUNT(*)=@testcount  )

    if @test = 1 AND @IsDroped = 1
    begin
    alter table mtp drop column name
    end

END

このSPを実行する

EXEC TestSP 1
于 2013-05-02T05:59:00.927 に答える