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

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

2
INSERTステートメント内の行値式の数が、許可されている1000行値の最大数を超えています
INSERT INTOスクリプトの1つは次のように書かれています。 INSERT INTO tableName (Column1, Column2,....) VALUES (value1, Value2,...), (value1, Value2,...),.... 以下は、上記の挿入ステートメントの解析で直面しているエラーです メッセージ10738、レベル15、状態1、行1007 INSERTステートメントの行値式の数が、許可されている最大1000行値を超えています。 私の簡単な質問は、1000個の値の制限を変更できますか?

5
なぜCASEステートメントを使用して列が存在するかどうかを確認し、その列からSELECTできないのですか
なぜこのようなものが機能しないのですか? SELECT CASE WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL ELSE Somecol END AS MyTest FROM Customers; 列が存在するかどうかを確認しているだけですが、SQL Server Somecolは存在しないことについて不平を言っています。単一のステートメントでこれに代わるものはありますか?
17 sql-server  t-sql 

3
特定の列の更新を制限します。ストアドプロシージャによるこれらの列の更新のみを許可する
ストアドプロシージャを通じてのみ更新したい繊細な価格列があります。更新するように設計されたストアドプロシージャを使用していない場合、すべてのコードまたは手動でこれらの価格列の値を変更しようとすると失敗します。 トリガーとトークンテーブルを使用してこれを実装することを検討しています。私が考えているアイデアは、トークンテーブルを持つことです。ストアドプロシージャは、最初にトークンテーブルに値を挿入する必要があります。次に、価格列を更新します。更新トリガーは、更新された行のトークンテーブルにトークンが存在するかどうかを確認します。見つかった場合、続行します。トークンが見つからない場合、例外をスローし、更新トランザクションを失敗させます。 この制限を実装する良い/より良い方法はありますか?

2
すべての子供の合計を見つける再帰的CTE
これは、再帰T-SQLクエリ(おそらくCTE)を使用して検索したいアセンブリツリーです。以下の結果が期待されます。任意の部品について、アセンブリごとの合計金額を知りたい。 つまり、「Rivet」を検索すると、直接の子の数だけでなく、アセンブリ内の各レベルの合計数を知りたいのです。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 現在、直接の親を取得できますが、CTEを拡張してこの情報を上にロールアップできるようにする方法を知りたいです。 With …

3
各ノードにランダムな数の子がある複数レベルの階層を作成する
階層を含むテストデータを作成する必要があります。私はそれを簡単にし、いくつかのことをすることができましたが、それCROSS JOINは私に完全に均一な/変化のない構造を与えるでしょう。それは鈍いように見えるだけでなく、テストデータの変動がないために、他の方法では見つからない問題を隠してしまうことがあります。だから、私はこれらのルールに従う不均一な階層を生成したいと思っています: 深さ3レベル レベル1はランダムに5〜20ノードです レベル2は1〜10ノードで、レベル1の各ノードごとにランダムです レベル3は1〜5ノードで、レベル2の各ノードごとにランダムです すべてのブランチは3レベルの深さになります。この時点で深さの均一性は問題ありません。 任意のレベルで子ノードの名前が重複する可能性があります(つまり、子ノードの名前は、同じレベルのすべてのノードで一意である必要はありません)。 ここで「ランダム」という用語は、一意にランダムではなく、疑似ランダムであると定義されています。「ランダム」という用語は「複製を生成しない特定のセットのランダムな順序」を意味するためによく使用されるため、これについて言及する必要があります。ランダム=ランダムを受け入れ、レベル1の各ノードあたりの子の数が4、7、および8のみである場合、レベル1の20のノードでさえ、それらのノードごとに1-10の子の潜在的な広がりがある場合、それは問題ありません、なぜならそれがランダムであるからです。 これは入れ子にすると非常に簡単にできますが WHILEループを使用してますが、設定ベースのアプローチを見つけることが優先ます。一般的に、テストデータの生成にはプロダクションコードに必要な効率性の要件はありませんが、セットベースのアプローチの撮影はより教育的であり、問​​題に対するセットベースのアプローチを見つけるのに役立つでしょう。したがって、WHILEループは除外されませんが、セットベースのアプローチが不可能な場合にのみ使用できます。 Set-based =理想的には、CTE、APPLYなどに関係なく、単一のクエリです。したがって、既存またはインラインの数値テーブルを使用するのが適切です。WHILE / CURSOR /手続き型アプローチを使用しても機能しません。操作がすべてセットベースでループがない限り、データの一部を一時テーブルまたはテーブル変数にステージングすると思います。ただし、そうは言っても、複数クエリアプローチの方が実際に優れていることが示されない限り、単一クエリアプローチの方が複数のクエリよりも好まれます。「より良い」を構成するものは通常主観的であることに注意してください;-)。また、前の文での「通常」の使用も主観的であることに留意してください。 SQL Serverのすべてのバージョンとエディション(2005年以降、私は推測します)で対応します。 純粋なT-SQLのみ:その愚かなSQLCLRのものはありません!! 少なくともデータの生成に関しては。ディレクトリとファイルの作成は、SQLCLRを使用して行われます。しかし、ここでは、作成するものの価値を生成することに焦点を当てています。 T-SQL Multi-statement TVFは、外部ではセットの手続き型アプローチをマスクしているにもかかわらず、セットベースではなく手続き型と見なされます。それが絶対に適切な場合があります。これは当時のものではありません。それらと同じ線に沿って、T-SQLスカラー関数も手続き型であるという理由だけでなく、クエリオプティマイザーが値をキャッシュして、出力が期待どおりにならないように繰り返すこともあります。 T-SQLインラインTVF(別名iTVF)は、セットベースであるため、okey-dokey [ CROSS | OUTER ] APPLYであり、上記のok として説明したを使用するのと実質的に同じです。 クエリを繰り返し実行すると、前回の実行とほとんど異なる結果が生成されます。 明確化の更新1:最終結果セットは、レベル1で始まるフルパスを持つ、レベル3の個別のノードごとに1つの行を持つように表現する必要があります。これは、単一のLevel3ノードのみを含む単一のLevel2ノードしかない場合を除いて、Level1とLevel2の値が必ず1つ以上の行にわたって繰り返されることを意味します。 明確化の更新2:番号だけでなく、名前またはラベルを持つ各ノードに非常に強い優先順位があります。これにより、結果として得られるテストデータがより有意義で現実的になります。 この追加情報が重要かどうかはわかりませんが、何らかのコンテキストが役立つ場合に備えて、テストデータはこの質問に対する私の回答に関連しています。 XMLファイルをSQL Server 2012にインポートする この時点では関係ありませんが、この階層を生成する最終目標は、ディレクトリ構造を作成して、再帰的なファイルシステムメソッドをテストすることです。レベル1と2はディレクトリになり、レベル3はファイル名になります。私は周りを検索しました(ここでもGoogle経由でも)で、ランダムな階層を生成するための参照が1つだけ見つかりました。 Linux:ランダムなディレクトリ/ファイル階層を作成する (StackOverflowでの)その質問は、テスト用のディレクトリ構造を作成しようとするため、実際には望ましい結果の点で非常に近いです。しかし、その質問(および回答)はLinux / Unixシェルスクリプトに焦点を当てており、私たちが住んでいるセットベースの世界ではありません。 これで、ランダムデータを生成する方法がわかりました。また、バリエーションを表示できるように、ファイルのコンテンツを作成するために既にそうしています。ここで注意が必要なのは、特定のフィールドではなく、各セット内の要素の数がランダムであることです。また、各ノード内の要素の数は、同じレベルの他のノードからランダムである必要があります。 階層の例 Level 1 Level 3 |---- …

2
乱数と結合タイプを使用した予期しない結果
4つの乱数(1から4)を取得し、結合して一致するdatabase_id番号を取得する単純なスクリプトがあります。LEFT JOINを使用してスクリプトを実行すると、毎回4行が返されます(予想される結果)。ただし、INNER JOINを使用して実行すると、行の数が変化します(2行、8行の場合もあります)。 論理的には、sys.databasesにdatabase_ids 1〜4の行が存在することがわかっているため、違いはありません。また、(結合するのではなく)4つの行を持つ乱数テーブルから選択しているため、4行以上が返されることはありません。 これはSQL Server 2012と2014の両方で発生します。INNERJOINがさまざまな行数を返す原因は何ですか? /* Works as expected -- always four rows */ SELECT rando.RandomNumber, d.database_id FROM (SELECT 1 + ABS(CHECKSUM(NEWID())) % (4) AS RandomNumber FROM sys.databases WHERE database_id <= 4) AS rando LEFT JOIN sys.databases d ON rando.RandomNumber = d.database_id; /* Returns a varying number …
16 sql-server  t-sql 

2
非ASCII文字を確認する方法
VARCHARフィールドに非ASCII文字が含まれているかどうかを確認する最良の方法は何ですか? CHAR(1)スルーCHAR(31)とCHAR(127)スルーCHAR(255)。 使用PATINDEXしてみましたが、次の問題に遭遇しました。 低い範囲のチェックは正常に機能しました。 SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 私のデータには0x1Eのレコードが3つあり、3つすべてが返されました。 しかし、上の範囲だけをチェックすると: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 テーブル内のすべてのレコード(テーブルカウント170737および返されたカウント170735)に近い値を返します。この範囲の値がデータにないため、レコードが返されなかったはずです。

3
「プレビューモード」のデータベースストアドプロシージャ
私が使用しているデータベースアプリケーションのかなり一般的なパターンは、「プレビューモード」を持つレポートまたはユーティリティのストアドプロシージャを作成する必要があることです。そのようなプロシージャが更新を行う場合、このパラメータはアクションの結果が返されるべきであることを示しますが、プロシージャは実際にデータベースの更新を実行するべきではありません。 これを実現する1つの方法ifは、パラメーターのステートメントを記述するだけで、2つの完全なコードブロックを作成することです。1つは更新を実行してデータを返し、もう1つはデータを返すだけです。しかし、これは、コードの重複と、プレビューデータが実際に更新で発生することを正確に反映しているという比較的低い信頼度のため、望ましくありません。 次の例では、トランザクションセーブポイントと変数(一時テーブルとは対照的に、トランザクションの影響を受けない)を活用して、ライブ更新モードとしてプレビューモードのコードの単一ブロックのみを使用しようとします。 注:トランザクションのロールバックは、このプロシージャコール自体がトランザクションにネストされている可能性があるため、オプションではありません。これはSQL Server 2012でテストされています。 CREATE TABLE dbo.user_table (a int); GO CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] ( @preview char(1) = 'Y' ) AS CREATE TABLE #dataset_to_return (a int); BEGIN TRANSACTION; -- preview mode required infrastructure DECLARE @output_to_return TABLE (a int); SAVE TRANSACTION savepoint; -- do stuff here INSERT INTO dbo.user_table (a) …
15 sql-server  t-sql 

2
結合ヒントを追加すると、SQL Serverの行の見積もりが変更されるのはなぜですか?
私はいくつかのテーブルを結合し、かなり悪いパフォーマンスを発揮するクエリを持っています-行の推定はかなり(1000回)オフであり、ネストされたループ結合が選択され、複数のテーブルスキャンが発生します。クエリの形状は非常に単純で、次のようになります。 SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID クエリをいじると、結合の1つにMerge結合を使用するようにヒントを出すと、実行が何倍も速くなることに気付きました。これは理解できます-結合結合は、結合されるデータにとってより良いオプションですが、SQL Serverはネストされたループを選択するだけでは正しく推定しません。 私が完全に理解していないのは、この結合ヒントがすべてのプラン演算子のすべての推定値を変更する理由です。さまざまな記事や本を読んで、計画を構築する前にカーディナリティの推定が実行されると想定したため、ヒントを使用しても推定は変更されず、SQL Serverに特定の物理結合実装を使用するよう明示的に指示します。 ただし、Mergeヒントを使用すると、すべての推定がほぼ完璧になります。なぜこれが起こるのか、ヒントなしでクエリオプティマイザーがより良い推定を行う一般的な手法はありますか?統計が明らかにこれを許可していることを考慮して? UPD:匿名化された実行計画はここにあります:https : //www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan ? dl = 0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 TF 3604、9202、9204を使用して両方のクエリで使用される統計情報を確認しましたが、これらは同じです。ただし、スキャン/シークされるインデックスはクエリによって異なります。 それに加えて、クエリを実行しようとしましたOPTION …

2
スカラー値の関数に選択ではなく実行権限が必要なのはなぜですか?
スカラー値関数の場合、選択だけでなく実行をユーザーに許可しなければならないのはなぜだろうか? 一方、テーブル値関数は、選択権限またはdb_datareaderメンバーシップのみで問題なく機能します。 ここでより明確にするのは私の例です:データベースへの読み取り専用権限を持つユーザーが必要です。という名前のユーザーを作成し、メンバーシップtestUserを付与しdb_datareaderます。次に、というテーブル値関数を作成しましたfn_InlineTable。そしてすべてが素晴らしいです。testUserこのSQLを終日実行します select * from dbo.fn_InlineTable その後、スカラー関数が必要なので、というスカラー関数を作成しましたfn_ScalarTest。 testUserこのSQLを実行できません Select dbo.fn_ScalarTest(1) 当然のことながら、実行するための "testUser"アクセス許可を与えていないためfn_ScalarTestです。 私の質問は次のとおりです:このリンクに基づいて/programming/6150888/insert-update-delete-with-function-in-sql-server、FUNCTIONデータベースの状態を変更するアクションを実行するために使用することはできません。では、実行許可ではなく、同じ「SELECT」許可でスカラー関数を使用させないのはなぜですか? 私の質問が理にかなっていることを願っています。ありがとうございました。

1
指定した時間だけ一時停止/スリープ/待機するクエリを設計するにはどうすればよいですか?
SQL Server 2000インスタンスに対して監視アプリケーションをテストしています。指定した時間がかかるT-SQLクエリを作成するにはどうすればよいですか?たとえば、ほとんどのスクリプト言語にはSLEEP、指定された時間だけスクリプトの実行を一時停止できるコマンドのようなものがあります。SQL Server 2000と互換性のある類似のものを探しています。これは、監視アプリケーションの長時間実行されるクエリのしきい値設定をテストすることを目的としています。

3
win-loss-tieデータからストリークカウントとストリークタイプを取得する
誰にとっても物事が簡単になる場合は、この質問に対してSQL Fiddleを作成しました。 ある種のファンタジースポーツデータベースがあり、私が理解しようとしているのは、「現在のストリーク」データ(チームが最後の2つのマッチアップに勝った場合は「W2」、負けた場合は「L1」など)前回の対戦で勝利した後の最後の対戦-または、最新の対戦で同点だった場合は 'T1')。 基本的なスキーマは次のとおりです。 CREATE TABLE FantasyTeams ( team_id BIGINT NOT NULL ) CREATE TABLE FantasyMatches( match_id BIGINT NOT NULL, home_fantasy_team_id BIGINT NOT NULL, away_fantasy_team_id BIGINT NOT NULL, fantasy_season_id BIGINT NOT NULL, fantasy_league_id BIGINT NOT NULL, fantasy_week_id BIGINT NOT NULL, winning_team_id BIGINT NULL ) 列の値はNULL、winning_team_idその一致の同点を示します。 以下に、6チームと3週間分の対戦のサンプルデータを含むサンプルDMLステートメントを示します。 INSERT INTO FantasyTeams …

4
メンテナンスプランジョブでローカルサーバー接続を変更または更新する方法
2日前に、クライアントが開発サーバー名の1つを変更しました サーバーの名前が変更された後、サーバー名が一致しないため、すべてのメンテナンスジョブおよびその他のジョブが失敗します。 私たちは、使用しているSQL Server 2012のバージョンとサーバー2008 OSを だから今日の朝、私はSQL Server 2012の名前を名前を更新して名前を変更し、テーブル、手順を更新しました メンテナンスジョブでローカルサーバー接続を更新しようとしましたが、編集できません。次に、新しいサーバー接続を追加しましたが、ジョブを実行中にエラーが発生することはありません。 ジョブプロパティオプションのターゲットページで試した後、ターゲットサーバーのみが選択され、複数のターゲットサーバーが無効になっています。 以下のエラー ユーザーとして実行:NT Service \ SQLSERVERAGENT。64ビット版Microsoft(R)SQL Server Execute Package Utilityバージョン11.0.2100.60 Copyright(C)Microsoft Corporation。全著作権所有。 開始:12:01:28 AMエラー:2013-12-16 00:01:43.98コード:0xC00291ECソース:{410F7661-F71A-4B68-9584-BA422AB00F02} SQLタスクの実行の 説明:接続「ローカルサーバー接続」の取得に失敗しました。接続が正しく構成されていないか、この接続に対する適切な権限がない可能性があります。終了エラー エラー:2013-12-16 00:02:00.00 コード:0xC0024104 ソース:Territory_Update 説明:タスクのExecuteメソッドがエラーコード0x80131904を返しました(SQL Serverへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできませんでした。インスタンス名が正しいことと、 SQL Serverは、リモート接続を許可するように構成されています(プロバイダー:名前付きパイププロバイダー、エラー:40-SQL Serverへの接続を開けませんでした)。Executeメソッドは成功し、「out」パラメーターを使用して結果を示す必要があります。終了エラー エラー:2013-12-16 00:02:15.00 コード:0xC0024104 ソース:{4E2AF328-0B8D-4905-83BE-839FDDEFC09C} 説明:タスクのExecuteメソッドがエラーコード0x80131904を返しました(SQL Serverへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできませんでした。インスタンス名が正しいことと、 SQL Serverは、リモート接続を許可するように構成されています(プロバイダー:名前付きパイププロバイダー、エラー:40-SQL Serverへの接続を開けませんでした)。Executeメソッドは成功し、「out」パラメーターを使用して結果を示す必要があります。 終了エラーDTExec:パッケージ実行はDTSER_FAILURE(1)を返しました。 開始:12:01:28 AM 終了:12:02:15 AM …

2
実行プランを使用してT-SQLクエリを最適化する方法
過去2日間、試行錯誤と実行計画を使用して最適化しようとして費やしたSQLクエリがありますが、役に立ちません。これを行うことを許してください。しかし、私はここに実行計画全体を掲載します。簡潔にするためと会社のIPを保護するために、クエリおよび実行プランのテーブル名と列名を汎用にするように努力しました。実行計画は、SQL Sentry Plan Explorerで開くことができます。 かなりの量のT-SQLを実行しましたが、実行プランを使用してクエリを最適化することは私にとって新しい分野であり、その方法を本当に理解しようとしました。したがって、誰かがこれを手伝って、この実行計画を解読してクエリで最適化する方法を見つける方法を説明できれば、私は永遠に感謝しています。最適化するクエリはさらに多くあります。この最初のクエリを支援するための踏み台が必要です。 これはクエリです: DECLARE @Param0 DATETIME = '2013-07-29'; DECLARE @Param1 INT = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112)) DECLARE @Param2 VARCHAR(50) = 'ABC'; DECLARE @Param3 VARCHAR(100) = 'DEF'; DECLARE @Param4 VARCHAR(50) = 'XYZ'; DECLARE @Param5 VARCHAR(100) = NULL; DECLARE @Param6 VARCHAR(50) = 'Text3'; SET NOCOUNT ON DECLARE @MyTableVar TABLE …

4
トランザクションでテーブル構造を変更し、エラーが発生した場合にロールバックできますか?
ALTER TABLE実行中のステートメントがいくつかあります。すべてが機能するわけではありません(SQLデータ比較の実行結果です)。それらをいくつかのトランザクションにグループ化し、何か問題が発生した場合はステートメントをロールバックします。 これは可能ですか、それともロールバックできるデータのみですか?

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