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

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

2
sp_msforeachdbは、舞台裏でどのように正確に機能しますか?
発生している問題をトラブルシューティングする必要があります。また、問題を解決するためにsp_msforeachdbがどのように機能するかを理解するための支援が必要です。 sp_msforeachdbを実行するたびにエラーが発生する Msg 102, Level 15, State 1, Incorrect syntax near '61' 私のコードの例は次のとおりです: EXEC SP_msforeachdb 'SELECT ''?'' AS Database FROM ?.sys.objects WHERE name like ''%aetna%'' ただし、sp_msforeachdbのパラメーターとしてどのクエリを使用してもかまいません。同じエラーが発生するたびに。「61s1d」で始まるデータベースがあるので、DB名に問題があると思いますが、sp_msforeachdbの背後で何が起こっているのか、正直にわかりません。 注意事項。 数字で始まる唯一のデータベース 「データベースが '%61%'のようなものではありません……」のようなコードを使用することはできますが、それでも同じエラーが発生します。 データベース名の変更をテストすることはできません-接続しているものが多すぎます。 「51」で始まるテストデータベースを作成すると、そのデータベースのエラーも表示されます どうすればこれを克服できますか?

3
PKの目的でのみ、自動インクリメント/ IDENTITYフィールドを相互参照テーブルに追加する必要がありますか?
次の相互参照テーブルをSQL ServerがホストするDBに追加します。 company_id bigint not null (FK) org_path nvarchar (2048) not null company_idフィールドはid、別のテーブルのフィールドを参照します(そのフィールドが主キーです)。 同じを持つ複数のレコードも存在する可能性があることを考えるとcompany_id、主キーは両方のフィールドを使用する必要があります。ただし、org_pathSQL Serverには長すぎるため、両方のフィールドを使用してキーを作成できません。 に関してはorg_path、これが存在する唯一のテーブルです。このテーブルへのクエリがすべてのエントリまたはすべてのorg_pathエントリのいずれかを要求する可能性はほとんどありませんcompany_id。別の言い方をすると、このテーブルがによってクエリされることは疑わしいようorg_pathです。さらに、org_path更新される可能性は低く、おそらく挿入され、おそらく削除されることはほとんどありません。 行の総数は数千になると思います。 また、その理由nvarchar (2048)は、値がサードパーティのDBの値を模倣する必要があるためです。典型的な例は次のようになります \Translation Providers\[customer name]\[order name]\ 分音符号を含めることができます。 だから私の質問はこれです:自動インクリメントidフィールドを追加しcompany_idてそれを主キーとして使用する方が効率的ですか、それとも不必要なオーバーヘッドが追加されますか-そしてcompany_id、別のテーブルの主キーであるという事実にはここで効果?

1
インジェクション攻撃から保護するためにQUOTENAMEを引き続き使用する必要がありますか?
今日、古いストアドプロシージャを見ていquotenameて、入力パラメーターで使用されていることに気付きました。それが何をしているのかを正確に理解するために少し掘り下げた後、私はこのサイトを見つけました。私はそれが何をするか、そしてそれをどのように使うかを理解しました、しかしサイトはそれがSQLインジェクション攻撃からの緩和として使われると言います。asp.netを使用してデータベースを直接クエリするアプリを開発していたときは、ADO.Netパラメータを使用してユーザー入力をリテラル値として渡し、ストアドプロシージャでそれを保護することについて心配することはありませんでした。 現在、自分が記述し​​ていないアプリケーションで使用されるストアドプロシージャを記述しているので、プロシージャレベルでインジェクション攻撃から保護する必要quotenameがあります。これは、これを行うための最良の方法であるか、より新しい機能/優れた方法があります。方法? この思考パターンに私を導いたコード(@parm1ユーザー入力パラメーターです): 'SELECT project [Project], project_desc [Description], customer [Customer], cpnyid [Company] FROM PJPROJ (nolock) where project like ' + quotename(@parm1,'''') + '

1
FOREIGN KEYに明示的な単一のKEY値を持つMERGE JOIN(INDEX SCAN)を克服する
追加7/11問題は、MERGE JOIN中のインデックススキャンが原因でデッドロックが発生することです。この場合、トランザクションはFK親テーブルでインデックス全体のSロックを取得しようとしますが、以前は別のトランザクションがインデックスのキー値にXロックをかけています。 小さな例から始めましょう(70-461コースのTSQL2012 DBが使用されています): CREATE TABLE [Sales].[Orders]( [orderid] [int] IDENTITY(1,1) NOT NULL, [custid] [int] NULL, [empid] [int] NOT NULL, [shipperid] [int] NOT NULL, ... ) 列[custid], [empid], [shipperid]は、[Sales].[Customers], [HR].[Employees], [Sales].[Shippers]それに応じて相互に関連するパラメーターです。いずれの場合も、親テーブルの参照列にクラスター化インデックスがあります。 ALTER TABLE [Sales].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([custid]) REFERENCES [Sales].[Customers] ([custid]) ALTER TABLE [Sales].[Orders] WITH CHECK ADD CONSTRAINT …

1
xmlパラメータを使用して複数のデータをアップサートするときにマージクエリの使用を回避する方法
値の配列でテーブルを更新しようとしています。配列の各項目には、SQL Serverデータベースのテーブルの行と一致する情報が含まれています。行がテーブルに既に存在する場合、その行を指定された配列の情報で更新します。それ以外の場合は、テーブルに新しい行を挿入します。基本的にアップサートについて説明しました。 現在、私はこれを、XMLパラメーターを受け取るストアード・プロシージャーで実現しようとしています。テーブル値パラメーターではなくXMLを使用する理由は、後者の場合、SQLでカスタムタイプを作成し、このタイプをストアドプロシージャに関連付ける必要があるためです。将来、ストアドプロシージャまたはdbスキーマの何かを変更した場合、ストアドプロシージャとカスタムタイプの両方をやり直す必要があります。このような状況は避けたいです。さらに、データ配列のサイズが1000を超えることはないため、TVPがXMLよりも優れていることは、私の状況では役に立ちません。これは、ここで提案されているソリューションを使用できないことを意味します。SQLServer 2008でXMLを使用して複数のレコードを挿入する方法 また、ここでの同様のディスカッション(UPSERT-MERGEまたは@@ rowcountのより良い代替案はありますか?)は、テーブルに複数の行をアップサートしようとしているため、私が求めているものとは異なります。 次の一連のクエリを使用して、xmlから値を更新することを望んでいました。しかし、これはうまくいきません。このアプローチは、入力が単一の行である場合にのみ機能すると想定されています。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 次の代替方法は、完全なIF EXISTSまたは次の形式のバリエーションの1つを使用することです。しかし、私は次善の効率であることを理由にこれを拒否します: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 次のオプションは、http://www.databasejournal.com/features/mssql/using-the-merge-statement-to-perform-an-upsert.htmlで説明されているようにMergeステートメントを使用することでした。しかし、それから私はここでマージクエリの問題について読みました:http : …

2
2つの関連する「多数」のテーブルがあるテーブルの結果をフラット化する方法は?
データベース内のいくつかのテーブルをより柔軟に再編成しましたが、SQLを記述してそこから意味のあるデータを抽出する方法がよくわかりません。 次の表があります(より明確な例のために多少省略しています)。 CREATE TABLE Loans( Id int, SchemaId int, LoanNumber nvarchar(100) ); CREATE TABLE SchemaFields( Id int, SchemaId int, FieldName nvarchar(255) ); CREATE TABLE LoanFields( Id int, LoanId int, SchemaFieldId int, FieldValue nvarchar(4000) ); 次のデータで: INSERT INTO Loans (Id, SchemaId, LoanNumber) VALUES (1, 1, 'ABC123'); INSERT INTO SchemaFields (Id, SchemaId, …

1
sp_executeは、タイプ 'int'のパラメータ '@handle'を予期しています
宛先データベースにテーブルが存在するかどうかをストアドプロシージャでチェックインしようとしています。そうでない場合は、ソースデータベースのinformation_schemaテーブルを使用してテーブルを作成します。しかし、sp_executeを使用して、テーブルが存在する場合に返してみると、エラープロシージャで型 'int'のパラメーター '@handle'が予期されます。 @handleパラメータを使用していません。誰かがこのエラーの意味を教えてもらえますか?なぜ私がそれを受け取っているのですか?私のコードの関連部分は以下です。 DECLARE @SQL NVARCHAR(MAX), @Parameters NVARCHAR(4000), @TableNotExists INT, @SourceTable NVARCHAR(200), @DestDB NVARCHAR(200) BEGIN SET @SourceTable = 'table' SET @DestDB = 'database' SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT' SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE …

1
要素名の変数
私は問題なく動作するこのtSQLコードを持っています: SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes('/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y")]') as a(b) しかし、私ができるようにしたいのは、各値の間でORされる値の多くのペアの動的リストを渡すことです。 SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes( '/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y") or PropertyName=sql:variable("@a") and PropertyValue=sql:variable("@b") ]' ) as a(b) これを行う方法はありますか?
9 t-sql  xml 

6
同じIDであるがnullの行を選択し、そのIDの別の列で他の値を選択する
特定のユーザー名列NULL以外の値とその他の値を持つ行のみを取得したいNULL。 その特定のユーザー名に対して両方の行にnullがあるか、両方にnull以外の値がある場合、出力に表示されません。nullと他の値を持つ同じユーザー名の行が3つ以上ある場合は、それらが表示されます。 以下はサンプルのサンプルと出力です。SQLクエリを使用してどのように実行できますか? +----------+-------+ | username | col2 | +----------+-------+ | a | abc | | a | ef | | b | null | | b | null | | c | der | | c | null | +----------+-------+ 出力 +----------+------+ | username | col2 | +----------+------+ | …

2
nullまたは空のテーブル値パラメーターを確認するにはどうすればよいですか?
ストアドプロシージャ(SS2k8)があり、テーブル値パラメーターがいくつかあり、それらがnullまたは空になる場合があります。このStackOverflowの投稿を見たところ、null /空のTVPは呼び出しパラメーターリストから単に削除する必要があると述べています。私の問題は、「IF(@tvp IS NULL)」がプロシージャの作成に失敗し、「スカラー変数「@tvpを宣言する必要があります」というメッセージが表示されるため、ストアドプロシージャ内の空またはnullを確認する方法を理解できないことです。TVPでSELECT COUNT(*)を実行してゼロを確認する必要がありますか? コードの抜粋: CREATE PROCEDURE [foo] (@tvp [TvpType] READONLY) AS IF (@tvp IS NOT NULL) -- doesn't work BEGIN -- lots of expensive processing END ELSE BEGIN -- a little bit of cheap processing END ...


2
統計が最後に実行された日時を確認するにはどうすればよいですか?
最近、私たちのDBAチームが統計が最近実行されなかったことが原因であるとインデックスについて多くの問題を抱えています。これにより、SQL Management Studioを介して統計情報が最近更新されたかどうかを確認するにはどうすればよいですか。 この質問がこれをうまく説明していない場合はお詫び申し上げます。私はこれまで統計について紹介されてきただけで、以前はパフォーマンス関連の問題が発生するたびにインデックスを調べていました。 編集: 以下を使用していますが、構文エラーが表示されます。 use *databasename* exec sp_autostats *schema.tablename* 私が受け取っているエラーは: Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '.'. どうしてこれなの?

3
最近の行の累計をより速く取得するにはどうすればよいですか?
現在、トランザクションテーブルを設計しています。各行の現在までの合計を計算する必要があり、パフォーマンスが低下する可能性があることに気付きました。そこで、テスト用に100万行のテーブルを作成しました。 CREATE TABLE [dbo].[Table_1]( [seq] [int] IDENTITY(1,1) NOT NULL, [value] [bigint] NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO そして、最近の10行とその現在までの合計を取得しようとしましたが、約10秒かかりました。 --1st attempt SELECT TOP 10 seq …

4
Caseステートメントでクエリを終了しますか?
2つの異なるテーブルの2つの日付を比較し、それらが等しい場合、クエリが終了するようにクエリを設定しようとしています。それらが等しくない場合、クエリは続行し、いくつかのものを挿入します。しかし、どうすれば自分のやりたいことができるのかわかりません。 SELECT TOP(1) @dateA=a.someDate FROM a ORDER BY DESC; SELECT TOP(1) @dateB=b.someDate FROM b ORDER BY DESC; CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log; Insert statements; 任意の助けをいただければ幸いです。

3
特定の数式に基づいて欠落している最小の要素を特定する
数百万行のテーブルから欠落している要素を見つけることができる必要があり、BINARY(64)列の主キーがあります(これは計算に使用する入力値です)。これらの値はほとんど順番に挿入されますが、削除された以前の値を再利用したい場合があります。削除されたレコードをIsDeleted列で変更することはできません。現在の行の前に何百万もの値がある行が挿入される場合があるためです。つまり、サンプルデータは次のようになります。 KeyCol : BINARY(64) 0x..000000000001 0x..000000000002 0x..FFFFFFFFFFFF したがって、0x000000000002との間にすべての欠損値を挿入すること0xFFFFFFFFFFFFは実行不可能であり、使用される時間とスペースの量は望ましくありません。基本的に、アルゴリズムを実行する0x000000000003と、最初の開始点であるが返されることが期待されます。 私はC#でバイナリ検索アルゴリズムを考え出しました。これは、位置の各値についてデータベースにクエリを実行し、iその値が予期されているかどうかをテストします。コンテキストについては、私のひどいアルゴリズム:https : //codereview.stackexchange.com/questions/174498/binary-search-for-a-missing-or-default-value-by-a-given-formula このアルゴリズムは、たとえば、100,000,000アイテムのテーブルで26-27 SQLクエリを実行します。(それほど多くはないように見えますが、非常に頻繁に発生します。)現在、このテーブルには約50,000,000行あり、パフォーマンスが顕著になりつつあります。 私の最初の代替の考えは、これをストアドプロシージャに変換することですが、それには独自のハードルがあります。(私はBINARY(64) + BINARY(64)アルゴリズムや他の多くのものを書かなければなりません。)これは苦痛ですが、実行不可能ではありません。また、に基づく変換アルゴリズムの実装を検討しましたROW_NUMBERが、これについては非常に悪い直感があります。(A BIGINTはこれらの値に対して十分な大きさではありません。) 私はのためにアップしてる他の Iのように、提案本当にこれは、可能な限り迅速にする必要があります。C#クエリで選択された唯一の列に値するのはであり、他の列KeyColはこの部分には関係ありません。 また、価値のあるものとして、適切なレコードをフェッチする現在のクエリは次の行に沿っています。 SELECT [KeyCol] FROM [Table] ORDER BY [KeyCol] ASC OFFSET <VALUE> ROWS FETCH FIRST 1 ROWS ONLY <VALUE>アルゴリズムによって提供されるインデックスはどこにありますか。私もまだBIGINT問題を抱えていませんが、問題はOFFSETありません。(現在、50,000,000行しかないということは、その値を超えるインデックスを要求しないことを意味しますが、ある時点でBIGINT範囲を超えることになります。) いくつかの追加データ: 削除から、gap:sequential比率は約1:20です。 テーブルの最後の35,000行には、> BIGINTの最大値があります。

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