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

MicrosoftのSQL Serverの2008バージョンに固有の質問には、このタグを使用します。

5
数値をデータ型数値に変換する算術オーバーフローエラー
このクエリを実行するたびに、このエラーメッセージが表示され続けます。 Msg 8115, Level 16, State 8, Line 33 Arithmetic overflow error converting numeric to data type numeric. The statement has been terminated. しかし、作成テーブルを(7,0)に変更すると、エラーメッセージは表示されませんが、データを小数で表示する必要があります。私は8,3を試しましたが動作しません。 私がこれを行うのを手伝ってくれる人はいますか?どんな助けでも大歓迎です。 DECLARE @StartDate AS DATETIME DECLARE @StartDate_y AS DATETIME DECLARE @EndDate AS DATETIME DECLARE @temp_y AS DATETIME SET @temp_y = Dateadd(yy, Datediff(yy, 0, Getdate()), 0) SET …

2
ユーザー定義のテーブルタイプでEXECUTE権限が拒否されましたか?
SQL Server2008のユーザー定義テーブルタイプについて質問があります。 ASP.NETアプリケーションの1つが必要な場合は、SQL Server 2008で独自のテーブルタイプを定義して、それらをストアドプロシージャのパラメーターとして使用します(ASP.NETアプリケーションでsqlコマンドを実行する場合、DataTableオブジェクトをストアドプロシージャのパラメーターとして渡します。例についてはこちらをご覧ください) 問題は、ASP.NETからSQLコマンド(ストアドプロシージャの実行)を実行すると、次のエラーが発生することです。 オブジェクト 'ourTableType'、データベース 'ourDatabase'、スキーマ 'ourSchema'に対するEXECUTE権限が拒否されました。 どうしてこんなことに?ユーザー定義のテーブルタイプに権限を設定する必要があるのはなぜですか?それを使用するストアドプロシージャだけに権限を設定するだけでは不十分なのはなぜですか?そして、私たちは、なぜ何もありませんどのように関係なく、それを設定する必要がある場合はEXECUTEプロパティウィンドウの何で設定するアクセス権の種類は、(私は見ることができControl、References、Take Ownership、View Definition)? またControl、プロパティウィンドウでアクセス許可をに設定すると問題が解決し、ストアドプロシージャが問題なく実行されることもわかりません。

5
大きなテーブルのVARCHAR列のサイズを増やすと、問題が発生する可能性がありますか?
SQL Server 2008を使用していますが、約500k行のテーブルでVARCHARフィールドを(200から1200)に大きくする必要があります。私が知る必要があるのは、私が考慮していない問題があるかどうかです。 このTSQLステートメントを使用します。 ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 私はすでにデータのコピーでそれを試しました、そしてこの声明は私が見ることができる悪影響を持っていませんでした。 それで、私が考慮しなかったかもしれないこれをすることからの可能な問題はありますか? ちなみに、列にはインデックスが付けられていません。

10
SQLServer-ストアドプロシージャをあるデータベースから別のデータベースにコピーします
私はSQLを初めて使用し、2つの.mdfデータベースを1つに結合する必要がありました。SQL Server 2008Managerを使用してこれを行いました-[タスク]> [テーブルのインポート/エクスポート]。テーブルとビューは正常にコピーされましたが、新しいデータベースにストアドプロシージャがありません。それを行う方法はありますか?

5
MS SQLの日付を比較しますか?
私は2つの日付(日時)を持っています: date1 = 2010-12-31 15:13:48.593 date2 = 2010-12-31 00:00:00.000 その同じ日、ちょうど異なる時間。<=を使用してdate1とdate2を比較することは、date1の時間のために機能しません。したがって、date1 <= date2は間違っていますが、正しいはずです。年、月、日だけを見て同じになるように比較できますか?そのSQLServer2008。 ありがとう:)

9
大きなテーブルでのSQLServerクエリのパフォーマンスを向上させる
比較的大きなテーブル(現在200万レコード)があり、アドホッククエリのパフォーマンスを向上させることが可能かどうかを知りたいです。ここで重要なのはアドホックという言葉です。インデックスを追加することはオプションではありません(最も一般的にクエリされる列にはすでにインデックスがあります)。 単純なクエリを実行して、最近更新された100個のレコードを返します。 select top 100 * from ER101_ACCT_ORDER_DTL order by er101_upd_date_iso desc 数分かかります。以下の実行計画を参照してください。 テーブルスキャンからの追加の詳細: SQL Server Execution Times: CPU time = 3945 ms, elapsed time = 148524 ms. サーバーは、SQL Server 2008 r2 x64を実行する非常に強力です(メモリ48GB ram、24コアプロセッサから)。 更新 このコードは、1,000,000レコードのテーブルを作成するために見つかりました。次にSELECT TOP 100 * FROM testEnvironment ORDER BY mailAddress DESC、いくつかの異なるサーバーで実行して、サーバーでのディスクアクセス速度が遅いかどうかを確認できると思いました。 WITH t1(N) AS (SELECT 1 …

4
MS SQL Serverストアドプロシージャ内で配列を宣言するにはどうすればよいですか?
カーソルを使用して、各月の年に対応する12個の10進変数を宣言する必要があります。この変数の値を合計し、後でいくつかの販売情報を更新します。 SQLサーバーにこの構文があるかどうかわかりません Declare MonthsSale(1 to 12) as decimal(18,2) このコードは問題なく動作します。! CREATE PROCEDURE [dbo].[proc_test] AS BEGIN --SET NOCOUNT ON; DECLARE @monthsales TABLE ( monthnr int, amount decimal(18,2) ) -- PUT YOUR OWN CODE HERE -- THIS IS TEST CODE -- 1 REPRESENTS JANUARY, ... INSERT @monthsales (monthnr, amount) VALUES (1, 100) INSERT …



3
ビュー列をNOTNULLにする方法
列をtrueまたはfalseのみにするビューを作成しようとしています。しかし、私が何をしても、SQL Server(2008)は、私のビット列がどういうわけかnullになる可能性があると信じているようです。 「ステータス」列が「製品」というテーブルがありますINT, NULL。ビューでは、Product.Status列が3に等しい場合はBIT列をtrueに設定し、それ以外の場合はビットフィールドをfalseに設定して、Productの各行の行を返します。 SQLの例 SELECT CAST( CASE ISNULL(Status, 0) WHEN 3 THEN 1 ELSE 0 END AS bit) AS HasStatus FROM dbo.Product このクエリをビューとして保存し、オブジェクトエクスプローラーで列を見ると、列HasStatusはに設定されていBIT, NULLます。ただし、NULLであってはなりません。私はあることを、このコラムを強制するために使用できるいくつかの魔法のSQLのトリックがありますNOT NULL。 のCAST()周りを削除するCASEと、列は正しく設定されますがNOT NULL、列のタイプはに設定されますがINT、これは私が望むものではないことに注意してください。になりたいですBIT。:-)

3
T-SQLとWHERELIKE%Parameter%句
WHERE LIKE '%text%'句を使用するステートメントを作成しようとしましたが、テキストのパラメーターを使用しようとすると結果が表示されません。たとえば、これは機能します。 SELECT Employee WHERE LastName LIKE '%ning%' これにより、ユーザーにFlenning、Manning、Ningleなどが返されます。ただし、このステートメントでは次のことは行われません。 DECLARE @LastName varchar(max) SET @LastName = 'ning' SELECT Employee WHERE LastName LIKE '%@LastName%' 結果が見つかりません。助言がありますか?前もって感謝します。

3
完全外部結合と完全結合
クエリと例をいじって、結合をよりよく理解するだけです。SQL Server 2008では、次の2つのクエリで同じ結果が得られることに気づきました。 SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name SELECT * FROM TableA FULL JOIN TableB ON TableA.name = TableB.name これらはまったく同じアクションを実行して同じ結果を生成しますか、それともより複雑な例で異なる結果に遭遇しますか?これは単に交換可能な用語ですか?

8
単純なDateTimeSQLクエリ
特定の範囲内のDateTimeデータベースフィールドをクエリするにはどうすればよいですか? SQL SERVER2005を使用しています 以下のエラーコード SELECT * FROM TABLENAME WHERE DateTime >= 12/04/2011 12:00:00 AM AND DateTime <= 25/05/2011 3:53:04 AM 特定の時間範囲内で行を取得する必要があることに注意してください。例、10分の時間範囲。 現在、SQLは「12」の近くに誤った構文で返されます。」

4
bcp / BULKINSERTとテーブル値パラメーターのパフォーマンス
BULK INSERTスキーマが変更されたため、SQL Serverのコマンドを使用してかなり古いコードを書き直さなければならないところです。代わりに、TVPを使用してストアドプロシージャに切り替えることを検討する必要があると思いましたが、どのような影響があるのでしょうか。パフォーマンスに影響する可能性があります。 私がこの質問をしている理由を説明するのに役立つかもしれないいくつかの背景情報: データは実際にはWebサービスを介して受信されます。Webサービスは、データベースサーバー上の共有フォルダーにテキストファイルを書き込みます。共有フォルダーは、を実行しますBULK INSERT。このプロセスは元々SQLServer 2000に実装されていましたが、当時INSERTはサーバーで数百のステートメントをチャックする以外に方法はありませんでした。これは実際には元のプロセスであり、パフォーマンスの低下でした。 データは永続的なステージングテーブルに一括挿入されてから、はるかに大きなテーブルにマージされます(その後、ステージングテーブルから削除されます)。 挿入するデータの量は「大規模」ですが、「巨大」ではありません。通常は数百行、まれに5〜1万行がトップになります。したがって、BULK INSERTログに記録されていない操作であってもそれほど大きな違いはないというのが私の直感です(もちろん、私にはわかりません。したがって、質問です)。 挿入は実際にははるかに大きなパイプラインバッチプロセスの一部であり、連続して何度も実行する必要があります。したがって、パフォーマンスは重要です。 をBULK INSERTTVPに置き換えたい理由は次のとおりです。 NetBIOSを介してテキストファイルを書き込むことは、おそらくすでにある程度のコストがかかり、アーキテクチャの観点からはかなり厄介です。 ステージングテーブルは削除できる(そして削除すべきである)と私は信じています。その主な理由は、挿入されたデータを挿入と同時に他のいくつかの更新に使用する必要があり、ほとんど空のステージングを使用するよりも、大規模な本番テーブルから更新を試みる方がはるかにコストがかかるためです。テーブル。TVPでは、パラメータは基本的にあるステージング表、私はメインの挿入後/前に私が欲しいものを行うことができます。 重複チェック、クリーンアップコード、および一括挿入に関連するすべてのオーバーヘッドをほぼなくすことができました。 サーバーがこれらのトランザクションのいくつかを一度に取得する場合、ステージングテーブルまたはtempdbでのロックの競合について心配する必要はありません(回避しようとしますが、発生します)。 明らかに、本番環境に移行する前にこれをプロファイリングするつもりですが、この目的でTVPを使用することについて、誰かが厳しい警告を発するかどうかを確認するために、時間を費やす前にまず周りに尋ねるのは良い考えかもしれません。 つまり、SQL Server 2008に慣れていて、これを試したり、少なくとも調査したりした人にとって、評決は何でしょうか。たとえば、かなり頻繁に発生する数百から数千行の挿入の場合、TVPはマスタードをカットしますか?バルクインサートと比較してパフォーマンスに大きな違いはありますか? 更新:疑問符が92%少なくなりました! (別名:テスト結果) 最終結果は、36段階の展開プロセスのように感じられた後、現在本番環境にあります。両方のソリューションが広範囲にテストされました。 共有フォルダーコードをリッピングし、SqlBulkCopyクラスを直接使用します。 TVPを使用したスト​​アドプロシージャへの切り替え。 読者が正確に何がテストされたかを知ることができるように、このデータの信頼性に関する疑問を和らげるために、このインポートプロセスが実際に行うことのより詳細な説明を以下に示します。 通常は約20〜50データポイントの時間データシーケンスから始めます(ただし、数百になることもあります)。 データベースからほとんど独立している、クレイジーな処理をたくさん実行します。このプロセスは並列化されているため、(1)のシーケンスの約8〜10が同時に処理されています。各並列プロセスは、3つの追加シーケンスを生成します。 3つのシーケンスすべてと元のシーケンスを取得し、それらを1つのバッチに結合します。 現在完了している8〜10個の処理タスクすべてのバッチを1つの大きなスーパーバッチに結合します。 BULK INSERTストラテジー(次のステップを参照)またはTVPストラテジー(ステップ8にスキップ)のいずれかを使用してインポートします。 SqlBulkCopyクラスを使用して、スーパーバッチ全体を4つの永続的なステージングテーブルにダンプします。 JOIN(a)いくつかの条件を含む2つのテーブルで一連の集計ステップを実行し、(b)MERGE集計データと非集計データの両方を使用して6つの本番テーブルで実行するストアドプロシージャを実行します。(終了) または DataTableマージするデータを含む4つのオブジェクトを生成します。そのうちの3つにはCLRタイプが含まれていますが、残念ながらADO.NET TVPでは適切にサポートされていないため、文字列表現として組み込む必要があり、パフォーマンスが少し低下します。 TVPをストアドプロシージャにフィードします。ストアドプロシージャは、基本的に(7)と同じ処理を実行しますが、受信したテーブルを直接使用します。(終了) 結果はかなり近いものでしたが、データが1000行をわずかに超えた場合でも、TVPアプローチは最終的に平均してパフォーマンスが向上しました。 このインポートプロセスは何千回も連続して実行されるため、すべてのマージを完了するのにかかった時間(はい、時間)を数えるだけで、平均時間を取得するのは非常に簡単でした。 元々、平均的なマージが完了するまでにほぼ正確に8秒かかりました(通常の負荷の下で)。NetBIOSクラッジを削除し、に切り替えるとSqlBulkCopy、時間がほぼ正確に7秒に短縮されました。TVPに切り替えると、バッチあたりの時間がさらに5.2秒に短縮されました。これは、実行時間が時間単位で測定されるプロセスのスループットが35%向上するため、悪くはありません。また、SqlBulkCopy。よりも約25%向上しています。 私は実際、真の改善はこれよりもはるかに大きいとかなり確信しています。テスト中に、最終的なマージはもはやクリティカルパスではないことが明らかになりました。代わりに、すべてのデータ処理を実行していたWebサービスは、着信する要求の数に応じて座屈し始めていました。CPUもデータベースI / Oも実際には限界に達しておらず、重要なロックアクティビティはありませんでした。場合によっては、連続するマージの間に数秒のアイドル秒のギャップが見られました。わずかなギャップがありましたが、を使用するとはるかに小さくなりました(0.5秒程度)SqlBulkCopy。しかし、それはまた別の日の話になると思います。 結論:テーブル値パラメーターはBULK INSERT、中規模のデータセットで動作する複雑なインポート+変換プロセスの操作よりも実際に優れたパフォーマンスを発揮します。 プロステージングテーブルである人々の一部の不安を和らげるために、もう1つポイントを追加したいと思います。ある意味で、このサービス全体は1つの巨大なステージングプロセスです。プロセスのすべてのステップは徹底的に監査されるため、特定のマージが失敗した理由を特定するためのステージングテーブルは必要ありません(実際にはほとんど発生しませんが)。サービスにデバッグフラグを設定するだけで、デバッガーにブレークするか、データベースではなくファイルにデータをダンプします。 言い換えれば、私たちはすでにプロセスについて十分な洞察を持っており、ステージングテーブルの安全性を必要としません。そもそもステージングテーブルを用意した唯一の理由は、他の方法で使用しなければならなかったであろうすべてのステートメントINSERTとUPDATEステートメントをスラッシングしないようにするためでした。元のプロセスでは、ステージングデータはとにかくステージングテーブルに数分の1秒しか存在しなかったため、メンテナンス/メンテナンスの観点からは何の価値もありませんでした。 また、すべての操作をTVPに置き換えたわけではないことにも注意しBULK …

10
特定の月のすべてのレコードを検索するWHERE句
ストアドプロシージャに月と年を指定して、その月に発生するすべてのものを返すようにしたいのですが、月によって日数が異なるなどの理由で比較できないため、これを行うにはどうすればよいですか? これを行うための最良の方法は何ですか?年と月に基づいて比較するように依頼できますか? ありがとう。

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