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

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

5
計算列にフィルター選択されたインデックスを作成できません
私の前の質問で、テーブルに新しい計算列を追加するときにロックエスカレーションを無効にすることは良い考えですか?、計算列を作成しています: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 計算列はPERSISTEDであり、compute_column_definition(Transact-SQL)によると: 執着 データベースエンジンがテーブルに計算値を物理的に格納し、計算列が依存する他の列が更新されたときに値を更新することを指定します。計算列にPERSISTEDのマークを付けると、確定的ではあるが正確ではない計算列にインデックスを作成できます。詳細については、計算列のインデックスを参照してください。パーティションテーブルのパーティション列として使用される計算列には、明示的にPERSISTEDのマークを付ける必要があります。PERSISTEDが指定されている場合、compute_column_expressionは確定的でなければなりません。 しかし、列にインデックスを作成しようとすると、次のエラーが表示されます。 CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

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

2
AlwaysOn可用性グループの使用中にトランザクションログを圧縮する
私たちは、使用しているAlwaysOn Availability Group2012年の正規完全データベースバックアップとトランザクションログのバックアップがセカンダリデータベース上で毎日行われているSQL Serverの機能を。 私は読んだことが、ここでのプライマリレプリカまたはセカンダリレプリカのいずれかにトランザクションログのバックアップを行うことは、再利用可能なよう両方のレプリカトランザクション・ログをマークします。とにかく、トランザクションログのバックアップサイズは大きく、縮小ファイルを使用して縮小できます。 データベースをローカルに復元し、縮小操作を実行しました。ログファイルのサイズは160 MBに縮小されました。 私の質問は、どのデータベースでトランザクションログファイル(プライマリ、セカンダリ、またはその両方)の縮小操作を実行する必要があるかということです。 過去数年間、ログファイルのバックアップは作成されていなかったため、非常に大きくなりました。実行するDBCC SQLPERF (LOGSPACE)と0.06%、ファイルのみが使用されていることがわかります。このような巨大なサイズのログファイルを保持する意味はありません。で[sys].[database_files]、私はそのことを確認してくださいがmax_sizeに設定されている-1とgrowthする65536ことは、それが得るより多くのスペースを必要とするとき、私は推測するようにします。とにかく、将来の成長を防ぐために、たとえば5%に縮小できます。私はそうすることは悪い考えではないという確認を見つけようとしています。 実際、(データベースとログファイルの)バックアップはセカンダリデータベースでのみ実行されるため、それらのデータベースでシュリンクファイルを実行する方が簡単ですが、プライマリログファイルのサイズも小さくなりますか?

2
SQL Serverが実際に使用しているコアの数を確認するにはどうすればよいですか?
SQL Serverを実行している2つのサーバーがあります。 サーバー1:SQL Server 2008 R2 Express(4コア) サーバー2:SQL Server 2012 Developer Edition(8コア) 私の知る限り、SQL Server 2008 R2 Expressは1つのコアのみを使用する必要があります。 SQL Server 2012 Developerバージョンでは、8つのコアすべてを使用する必要があります。 ただし、SQL Server 2008 R2 ExpressでSQLクエリ内で次のコマンドを実行すると、4つのコアが表示されます。 select scheduler_id, cpu_id, status, is_online from sys.dm_os_schedulers where status = 'VISIBLE ONLINE' 適切なコマンドを使用して使用量を測定していますか?


2
VARCHARからVARBINARYへの変換
パフォーマンスの傾向を監視し、最適化が必要な領域を特定できるように、実行中の高価なクエリのログとクエリプランをテーブルに保存しています。 ただし、クエリプランが多くのスペースを占有するようになります(各クエリに対してプラン全体を保存しているため)。 したがって、QueryPlanHashとQueryPlanを別のテーブルに抽出することにより、既存のデータを正規化しようとしています。 CREATE TABLE QueryPlans ( QueryPlanHash VARBINARY(25), QueryPlan XML, CONSTRAINT PK_QueryPlans PRIMARY KEY ( QueryPlanHash ) ); query_plan_hashin の定義はsys.dm_exec_query_statsバイナリフィールドであるため(また、定期的に新しいデータを挿入します)、VARBINARY新しいテーブルのデータ型に使用していました。 ただし、以下の挿入は失敗します... INSERT INTO QueryPlans ( QueryPlanHash, QueryPlan ) SELECT queryplanhash, queryplan FROM ( SELECT p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash, QueryPlan, ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum FROM …


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 

8
大きなID値を避ける理由
私たちは、ユーザーがまだアクセスできないWebアプリケーションに取り組んでいます。上司は、テーブルに100未満のレコードしかないにもかかわらず、新しく作成されたレコードが10000を超えるIDを取得することに気付きました。彼女は、何らかの理由でWebインターフェースが実際のレコードよりも100倍以上の一時的なレコードを作成(および削除)し、これによりリリース後数か月以内に範囲外になる可能性があると考えました。 彼女はIDインフレーションの原因について正しいとは思わない(これに答えることができる同僚は休暇中なので、私たちは確実に知らない)が、彼女がそうであると仮定しよう。彼女は、bigintカラムを使用するのは嫌いで、IDカラムの自動インクリメントを停止し、最初の「未使用」整数を選択してそれをIDとして使用するサーバー側コードを記述してほしいと言いました。 私はコンピューターサイエンスの大学院生であり、実務経験がほとんどなく、開発者の若手として働いています。彼女は、当社のすべてのデータベースを管理し、それらのほとんどを設計した長年の経験を持っています。私が考える BIGINT IDがの恐れることは何もない、とDBMSの機能を模倣することはアンチパターンの匂いということを、彼女はこの場合には正しくないということ。しかし、私はまだ自分の判断を信用していません。 各ポジションの賛否両論は何ですか?bigintを使用すると、どのような悪いことが起こる可能性がありますか?ホイールの自動インクリメント機能を再発明することの危険性は何ですか?どちらよりも優れた3番目のソリューションはありますか?IDの額面価格の上昇を避けたい理由は何でしょうか?私は実用的な理由についても興味があります-bigint IDは理論的には機能するかもしれませんが、実際には頭痛の種になりますか? アプリケーションが非常に大量のデータを処理することは想定されていません。今後数年以内に実際の記録が10,000件に達するとは思わない。 違いがある場合は、Microsoft SQLサーバーを使用しています。アプリケーションはC#で記述され、Linq to SQLを使用します。 更新 ありがとう、私は既存の答えとコメントがおもしろいと思った。しかし、あなたは私の質問を誤解したのではないかと思うので、彼らは私が知りたいことを含んでいます。 高いIDの本当の理由についてはあまり心配していません。自分で見つけられない場合は、別の質問をすることができます。私が興味を持っているのは、この場合の決定プロセスを理解することです。このため、アプリケーションが1日あたり1000レコードを書き込み、そのうちの9999レコードを削除すると想定してください。これは事実ではないと確信していますが、これは上司が要求したときに信じていたものです。したがって、これらの仮想的な状況では、bigintを使用するか、IDを割り当てる独自のコードを作成することの長所と短所は何ですか(すでに削除されたレコードのIDを再利用し、ギャップがないようにする)? 実際の理由については、別のデータベースからデータをインポートするコードを書いたことが、後の移行がある程度できるという概念の証明として、私が強く疑っています。私の同僚は、実際にインポート中に数千のレコードを作成し、後でそれらを削除したと思います。これが実際にそうだったかどうかを確認する必要がありますが、もしそうなら、アクションの必要さえありません。

5
行間で90日が経過したギャップを再帰的に見つける方法
これは私のC#ホームワールドでは一種の些細な作業ですが、SQLでまだ作成しておらず、セットベース(カーソルなし)で解決することを好みます。結果セットは、このようなクエリから取得する必要があります。 SELECT SomeId, MyDate, dbo.udfLastHitRecursive(param1, param2, MyDate) as 'Qualifying' FROM T どのように機能するか これら3つのパラメーターをUDFに送信します。 UDFは内部的にparamsを使用して、ビューから関連する90日未満の古い行をフェッチします。 UDFは 'MyDate'をトラバースし、合計計算に含める必要がある場合は1を返します。 そうでない場合は、0を返します。ここでは「修飾」と名付けられています。 UDFが行うこと 行を日付順にリストします。行間の日数を計算します。結果セットの最初の行はデフォルトでHit = 1になります。差が最大90の場合、-ギャップの合計が90日になるまで次の行に渡します(90日目が経過する必要があります)。代わりに、結果から行を省略することもできます。 |(column by udf, which not work yet) Date Calc_date MaxDiff | Qualifying 2014-01-01 11:00 2014-01-01 0 | 1 2014-01-03 10:00 2014-01-01 2 | 0 2014-01-04 09:30 2014-01-03 1 | …

5
完全バックアップとコピーのみの完全バックアップの違い
SQL Server Centralスレッドで見た完全バックアップはログを切り捨てますか?その完全バックアップはログを切り捨てません: いいえ。完全バックアップでも差分バックアップでも、トランザクションログは切り捨てられません。- リン・ペティス はありません-フルバックアップは、ログを切り捨てません。- チャド・クロフォード それでは、完全バックアップとコピーのみの完全バックアップの違いは何ですか? ログバックアップには、ログを切り捨てずにログチェーンが壊れないようにするコピーのみのバックアップがあります。では、コピーのみの完全バックアップとは何ですか?

2
SQL Serverの接続権限を制限する
「名誉システム」セキュリティを使用する運用環境に展開するアプリがあります。つまり、すべてのユーザーがSQLユーザー/パスワード資格情報を使用してDBに接続し、アプリ自体が権限を管理します。後者の部分は、接続オブジェクトに埋め込まれた資格情報が含まれており、自由にコピーできるという事実ほど気にしません。接続をより限定的なクライアントのセットに制限する方法を見つけようとしています。もちろん、IPで制限するファイアウォールルールを作成できます。マシンアカウントまたはドメインメンバシップのいずれかでSQLログインを「事前認証」する方法はありますか?

5
複数のデータベースをC:からD:に一度に移動します
C:ドライブ、高速SSDで約14 GBを消費する323データベースを備えたSQL Server 2008 R2があります。 C:ドライブの一部の領域を再利用するため、それらをD:ドライブに移動します。 このMSDNの記事を見つけましたが、それは1つのデータベースのみを移動する手順のようです。 すべてのデータベースを一度に自動で移動する方法またはスクリプトはありますか?


1
クエリプラン「Cardinality Estimate」の警告
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 上記のクエリのクエリプランには警告があります。 <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> なぜ警告があるのですか? フィールドリストのキャストは、カーディナリティの見積もりにどのように影響しますか?

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