タグ付けされた質問 「t-sql」

Transact-SQL(T-SQL)は、Microsoft SQL ServerおよびSAPのSybaseで使用されるSQLの方言です。

1
RAISERRORでのFLOATの使用
私はRAISERROR()いくつかの基本的な単体テスト機能を提供するために(ここに示すように)使用FLOATsしていますが、エラーメッセージで使用できないことに不満を感じています。フロートを文字列にキャストできることはわかっていますがRAISERROR、すべての単体テストで使用しています。すべてのテストに別のコード行を追加したくありません。(私の単体テストはすでに十分に説明が豊富です!)パラメーターリスト内でインラインキャスト/変換を実行する方法はありRAISERRORますか?または、この欠陥を回避する別の方法はありますか? 更新: 最終的に私ができることは次のとおりです。 RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm) 残念ながら、RAISERROR一般的に%fまたはfloatを処理しません。だから私は代わりにこれをしなければなりません: DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40)) RAISERROR('Unit Test FAILED! %s', 11, 0, @str) ...何十もの単体テストに散らばっているときは、混乱のように見えます。だから私はそれを次のようなものに要約したいと思います: RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40)) しかし、それは私にIncorrect syntax near 'CAST'メッセージを送ります。それが違法である理由はわかりませんが、違法です。代わりにここで使用できる別の「ワンライナー」はありますか?
11 sql-server  t-sql 

2
日時列を秒数に変換します
SQL Serverデータベースにdatetime列があります。 列のlong値を表す新しい列を作成する良い方法は何datetimeですか?long秒数を表します。 これをlongsに変換できれば、長い数を固定量で除算できるので、期間ごとのクエリによるグループ化が簡単になると思いました。 テーブルは静的であり、データを更新または削除しません。

2
TSQLを使用してデータベースを動的に変更する方法
SSMSのコンテキストを動的SQLで指定されたデータベースに動的に変更しようとすると問題が発生します。 EXEC sys.sp_executesql N'USE db1 ' ; 正常に実行されますが、SSMSのデータベースコンテキストは変更されません。 上記のように少し変更してみました DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50) SET @db = N'db1' SET @sql = N'Use ' + @db EXEC sp_executesql @sql 繰り返しになりますが、正常に実行されますが、データベースは変更されません。

3
SQL Server Insert Into-切り捨てエラーの原因となっている列を特定する方法
テーブルに650のフィールドを挿入するストアドプロシージャがあります。挿入は、切り捨てエラーで失敗します。 簡単です INSERT INTO SELECT (a bunch of fields) FROM (a bunch of tables) 以下はエラーメッセージです。 メッセージ8152、レベル16、状態14、プロシージャDSP_Procedure、行1075文字列またはバイナリデータは切り捨てられます。 切り捨てエラーの原因となっているフィールドを簡単に特定できる方法はありますか? テーブルに挿入される選択ステートメントに650のフィールドがあるため、どのフィールドが切り捨てエラーの原因であるかを正確に特定することが困難です。 一度に100個のフィールドのみを挿入するように、一度にフィールドのブロックをコメント化し、少なくとも100個のフィールドのグループに絞り込むことができるまで、SP 6または7の異なる時間を実行できると思います。切り捨てエラーの原因となっているフィールドが含まれます。 またはSELECT INTO、新しいテーブルを作成して、SPに挿入しようとしているターゲットテーブルのデータ長とテーブルのデータ長を比較して、どのフィールドに予想より長いフィールド長が含まれているかを確認できると考えています。 .. SQL Server 2014を使用しています。 より簡単な代替手段はありますか?

4
ストアドプロシージャを使用して日付範囲の毎日の行を作成する方法
特定の日付範囲の毎日のテーブルに行を作成するストアドプロシージャを作成したいと思います。ストアドプロシージャは、2つの入力(ユーザーが希望する日付範囲の開始日と終了日)を受け入れます。 それで、私がそのようなテーブルを持っているとしましょう: SELECT Day, Currency FROM ConversionTable DayはDateTimeであり、Currencyは単なる整数です。 話を簡単にするために、これらの挿入された行ごとにCurrency列を常に1にしたいとします。したがって、誰かが「2017年3月5日」を開始日として入力し、「2017年4月11日」を終了日として入力した場合、次の行を作成します。 2017-03-05 00:00:00, 1 2017-03-06 00:00:00, 1 ... 2017-04-11 00:00:00, 1 これを行うためにストアドプロシージャをコーディングする最良の方法は何ですか?私のテスト環境ではSQL Server 2008 R2を使用していますが、実際の環境ではSQL Server 2012を使用しているため、このタスクを容易にする新しい機能が2012年に導入された場合、テストマシンをアップグレードできます。

5
DELETEステートメントがREFERENCE制約と競合しました
すべてのユーザーを削除しようとしていますが、エラーが発生します。 Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'. The statement has been terminated. クエリ: DELETE FROM [workdemo.no].[dbo].[M06Persons] WHERE ID > '13' GO 使用する必要on delete cascade;があるようですが、行き詰まっています。
11 sql-server  t-sql 

1
スーパーセットのみを選択
次のコマンドで作成できる2つのテーブル(非クラスター化インデックスと共に)があります。 CREATE TABLE GroupTable ( GroupKey int NOT NULL PRIMARY KEY, RecordCount int NOT NULL, GroupScore float NOT NULL ); CREATE TABLE RecordTable ( RecordKey varchar(10) NOT NULL, GroupKey int NOT NULL, PRIMARY KEY(RecordKey, GroupKey) ); CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey); 技術的にはテーブルが少し異なり、他のいくつかのテーブルに参加していますが、これは私の状況に適したプロキシです。 GroupKeys別のサブセットではないものをすべて選択したいGroupKey。 特定のスーパーセットについて、GroupScoreすべてのサブセット(それ自体を含む)の最大値を取得したいと思います。 a GroupKeyにRecordKeys別のとまったく同じものが含まれている場合GroupKey(s)、そのうちの1つだけGroupKeysが取得されます(どちらを使用してもかまいません)。 別のものとGroupKeyまったく同じであるものはすべて同じになります。RecordKeysGroupKey(s)GroupScore 非関連GroupKeysも同じスコアを持つことができます。 …

6
空白(スペース、タブ、改行)を削除する
私は、SQL Serverの2014年だと私は空白が簡単で、スペース、タブまたは改行(両方の可能性があり、列のコンテンツの開始と終了からクリーン空白に必要\nと\r\n)。例えば ' this content ' should become 'this content' ' \r\n \t\t\t this \r\n content \t \r\n ' should become 'this \r\n content' 等々。 私は最初のケースだけを達成することができました UPDATE table t SET t.column = LTRIM(RTRIM(t.column)) しかし、それ以外の場合は機能しません。

3
列の特殊文字をスペースで置き換える
特殊文字をスペースに置き換えるクエリを作成しようとしています。以下のコードは、行を識別するのに役立ちます。(英数字、カンマ、スペースは有効です): SELECT columnA FROM tableA WHERE columnA like '%[^a-Z0-9, ]%' 置換関数をselectステートメントに統合して、結果セット内の英数字、コンマ、スペース以外のすべての文字を ''(スペース)で置き換えるにはどうすればよいですか。これは機能しません: SELECT replace(columnA,'%[^a-Z0-9, ]%',' ') FROM tableA WHERE columnA like '%[^a-Z0-9, ]%'

4
FIRST()およびLAST()のSQL Server 2012バージョンは何ですか?
value列のあるテーブルがあります。次に示すように、最後の行から最初の行を差し引いて計算します。 id value 1 10 2 45 3 65 4 95 . . . . . . 500 200 入手したい 200 - 10 = 190 SQL Server 2012で以下のコマンドを使用しようとしましたがLAST、機能FIRSTしません。 SELECT LAST(Value) - FIRST(Value) FROM Counter; SQL Serverでのこのコマンドの構文は何ですか?

4
別の列に基づいて積算合計をリセットする
現在の合計を計算しようとしています。ただし、累積合計が別の列の値よりも大きい場合はリセットする必要があります create table #reset_runn_total ( id int identity(1,1), val int, reset_val int, grp int ) insert into #reset_runn_total values (1,10,1), (8,12,1),(6,14,1),(5,10,1),(6,13,1),(3,11,1),(9,8,1),(10,12,1) SELECT Row_number()OVER(partition BY grp ORDER BY id)AS rn,* INTO #test FROM #reset_runn_total インデックスの詳細: CREATE UNIQUE CLUSTERED INDEX ix_load_reset_runn_total ON #test(rn, grp) サンプルデータ +----+-----+-----------+-----+ | id | val | reset_val …

3
フィルタリングされたインデックスは、フィルタリングされたパーツがWHEREではなくJOINにある場合にのみ使用されます
以下のフィルターされたインデックスを作成しましたが、2つのクエリをさらに実行すると、このインデックスは、where句ではなく、JOINにEND_DTTMがある最初の例のシークにのみ使用されます(クエリの唯一の違いです)。 。なぜこれが起こるのか誰かが説明できますか? インデックスの作成 CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] ( [LIST_ID] ASC, [END_DTTM] ASC ) WHERE ([END_DTTM] IS NULL) クエリ DECLARE @LIST_ID INT = 3655 --This one seeks on the index SELECT PATIENT_LISTS.LIST_ID FROM DBO.PATIENT_LISTS LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL WHERE PATIENT_LISTS.LIST_ID = @LIST_ID …

3
SQLサーバー:巨大なテーブルのフィールドを小さなチャンクで更新:進行状況/ステータスを取得する方法?
非常に大きな(1億行)テーブルがあり、その上のいくつかのフィールドを更新する必要があります。 ログシッピングなどの場合も、一口サイズのトランザクションを維持する必要があります。 以下はトリックを行いますか? そして、どのようにして出力を印刷して、進行状況を確認できますか?(そこにPRINTステートメントを追加しようとしましたが、whileループ中に何も出力されませんでした) コードは次のとおりです。 DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or …
10 sql-server  t-sql 

1
TSQL変数の方がTopの方が速いのはなぜですか?
皆さんおはよう、 サードパーティ製品のデータベースからデータを「取得」して、自社の自社アプリケーションで表示するために、ある程度複雑なSQLに取り組んでいます。 サブクエリ内のテーブルからトップレコードを取得するために選択に追加しました(それが理にかなっている場合) クエリは、100レコードの最終結果セットを返すのに3分近くかかりました。 SELECT TOP 1 ... 私が達成しようとしていたことの改善点をオンラインで見て、以下のように変数を使用するように選択を変更するよう提案されました DECLARE @topCount INT SET @topCount = 1 SELECT TOP (@topCount) ... これは、3分から1秒まで同じクエリを使用しました。 しかし、これがそうである理由を誰かが説明できますか?
10 sql-server  t-sql 

1
テンポラルデータベース設計で一意のエントリを確保する正しい方法は何ですか?
テンポラルデータベースの設計に問題があります。店舗の任意の時間枠でアクティブレコードが1つだけであることを確認する方法を知る必要があります。私はこの答えを読みましたが、トリガーがどのように機能するかについて頭を抱えることはできません。特に、レコードの更新を防ぎ、代わりに新しいレコードを挿入する既存のトリガーをトリガーする方法。私の本当の問題は、終了日がnullの場合にストアが複数の有効日を持つことを防ぐ方法がわからないことです。(つまり、ストアの2つのアクティブなレコードを防止します) これは私が持っているものですが、有効日が異なる店舗の新しいレコードを挿入できます。 テーブル定義: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.