2016-07-06 22 views
1

私はちょうどSams Teach Yourself SQL in 10 Minutesを読み終えたという点でSQLの新機能です。だから私は本で終わったので、私はそれらと一緒に遊ぶことができるようにいくつかのテーブルを作成しようとしています。私は簡単に既知の量の列と指定されたヘッダーを持つテーブルを作成できます。私が問題を抱えているのは、未知の量の列と日付をヘッダーとして持つ表を作成することです。私がこれまで試してみましたが、このです:ループ内の変数を使用して列を作成/追加する方法

DECLARE @start_date AS DATE 
DECLARE @end_date AS DATE 
DECLARE @curr_date AS DATE 
DECLARE @column_name AS CHAR(10) 

SET @start_date = 2016-01-02 
SET @end_date = 2016-12-31 
SET @curr_date = @start_date 

WHILE @curr_date < @end_date 
    SET @curr_date = DATEADD(DD, 7, @curr_date) 
    ALTER TABLE Project_1 
     ADD @curr_date DOUBLE 

私はここで行うことを試みたことはループの始点と終点を作り、それ以来、私の列ヘッダとしてローカル変数に格納されたループ条件を使用しています私は列にタイトルが付いている必要があります。私もCASTをcharとしてキャストしようとしましたが、DBMSはその最後の行(ADD行)にIncorrect syntax near '@curr_date'があることを知らせてくれることを嬉しく思っています。ローカル変数(私は思う)。私はサンプル出力を持っていませんが、出力はCHARとして定義された最初の列を持つテーブルで、名前を保持するのでemp_nameというタイトルにする必要があります。他のすべての列はタイプDOUBLEとして定義されており、数時間を保持するため、@curr_dateヘッダーとして現在の日付を保持する必要があるため、NULLにする必要があります。私はALTERメソッドを通じてテーブルに追加されたすべてのカラムは、とにかくNULLにデフォルト設定されていると思います。私はselect文を保持する変数を宣言する動的SQLの例を見てきましたが、実際にテーブルに列を追加する方法を理解していません。私はこれがCREATEステートメントで実行できるかどうかはわかりませんが、それがあればそれを見るのはすばらしいことです。また、これは私が@end_dateに、彼らは年間2046

セキュリティがここ

+0

これは通常、あなたがスキーマのユーザーとして行うだろうものではありませんあなたは、一般的に、固定テーブル定義(ない動的なものを好むあなたの特定の質問に答えるために日付範囲に基づいてさまざまな数の列があります)。しかし、SQL文( 'declare @sql varchar(2000)')を作成し、それをalter文で作成し、 'EXEC'または' sp_executesql'を使って実行することができます – Igor

+0

"header"はどういう意味ですか?それは列名ですか?列名として日付を使用したくない場合。それは非常に貧しいデザインの兆候であることと一緒に働くことは痛いだけではありません。また、今日と2046の間の毎日の列を持つ列の数を考慮してください。列の最大数を数桁大きく超えます。 –

+0

より良いデザインをする方法を示すことができるように、ユースケースを教えてください。 – Hogan

答えて

1

私は行を使用してについてのコメントのすべてに同意する問題ではない...と言うことができますを変えることができるという事実に、変数にする必要があります動的に列を追加するのではなく、動的に列を動的にピボットすることができ、より柔軟に列を追加できます。そのため、おそらくいくつかのスキーマの考慮事項は、ちょうど近くには.....

DECLARE @start_date AS DATE 
DECLARE @end_date AS DATE 
DECLARE @curr_date AS DATE 
DECLARE @column_name AS CHAR(10) 

SET @start_date = '2016-01-02' 
SET @end_date = '2016-12-31' 
SET @curr_date = @start_date 

WHILE @curr_date < @end_date 
BEGIN 
    DECLARE @SQL NVARCHAR(MAX) 

    SET @curr_date = DATEADD(DD, 7, @curr_date) 

    SET @SQL = 'ALTER TABLE TableB 
     ADD [' + CAST(@curr_date AS VARCHAR(10)) + '] FLOAT' 

    --PRINT @SQL 
    EXECUTE (@SQL) 
END 
関連する問題