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

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

4
テーブル内のNULL値の自己比較
次のような不思議なt-sqlの振る舞いについて私はいつも困惑しています -- Create table t and insert values. use tempdb CREATE TABLE dbo.t (a INT NULL); -- insert 3 values INSERT INTO dbo.t values (NULL),(0),(1); GO set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null go -- expect 3 rows returned …

3
SQL Serverの8 KByteデータページから512バイトが使用されていません
次の表を作成しました。 CREATE TABLE dbo.TestStructure ( id INT NOT NULL, filler1 CHAR(36) NOT NULL, filler2 CHAR(216) NOT NULL ); 次に、クラスター化インデックスを作成しました。 CREATE CLUSTERED INDEX idx_cl_id ON dbo.TestStructure(id); 次に、各サイズが256バイトである30行(テーブル宣言に基づいて)を入力しました。 DECLARE @i AS int = 0; WHILE @i < 30 BEGIN SET @i = @i + 1; INSERT INTO dbo.TestStructure (id, filler1, filler2) VALUES …

5
SQL Serverには、実行中のストアドプロシージャに渡されるパラメーターの値を決定する方法があります
実行中のストアドプロシージャを決定する1つの方法は、次のような「動的管理」メソッドを使用することです。 SELECT sqlText.Text, req.* FROM sys.dm_exec_requests req OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext ただし、これはストアドプロシージャのcreateステートメントのテキストのみを表示します。例えば: CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id 理想的には、問題のあるパラメーターの特定のセットに対して非常に長く実行する原因となっている実行中のプロシージャーのパラメーターを確認したいと思います。 それを行う方法はありますか?(この質問では、 Aaron BertrandがDBCC InputBufferについて言及していますが、この問題には適切ではないと思います。)

2
コンピューター名にハイフンが含まれていてT-SQLエラーが発生する
私は開発者であり、DBAではありません(これは、私が恐れている)自宅のコンピューター(という名前のJohn-PC)でSQL Server 2014 Expressを使用してレポートビルダー3.0を実行しようとしていますが、レポートを実行できません。 私は偶然のユーザー/ログインコンボを作成user = John-PCしてlogin = John-PC\John。でエントリを削除しようとすると: Drop Login John-PC\John エラーが発生します: 「-」付近の構文が正しくありません。 問題は私のコンピューター名のハイフンだと思います。 構文エラーを回避する方法はありますか? ユーザーを変更またはドロップする別の方法はありますか(ドロップしようとしましsys.server_principalsたが、アドホックな変更ができないというエラーを受け取りました)。 どういうわけか、レポートビルダーに新しいユーザー/ログイン名を付けることはできますか? 上記のいずれでもない場合、コンピューターの名前を変更するJohn_PCことはできますか?

2
ブレントオザーのsp_BlitzIndexをAzureで実行するにはどうすればよいですか?
Brent OzarのWebサイトからSQL Server First Aid Kitをダウンロードしました。Azureデータベースサーバーレベルの管理者としてログインしているときに、Microsoft Sql Server Management Studioを介してmasterデータベースに対してsp_BlitzIndexスクリプトを実行しようとすると、次のエラーが発生しました。 メッセージ262、レベル14、状態18、プロシージャsp_BlitzIndex、行18 CREATE PROCEDURE権限がデータベース 'master'で拒否されました。 テストするデータベースインスタンスでプロシージャを正常に作成しました。プロシージャを実行すると、次のようなエラーが表示されました。 メッセージ50000、レベル16、状態1、行1265無効なオブジェクト名「mydatabase.sys.partitions」。 次に、巧妙にしようとし、ストアドプロシージャを作成せずにmasterデータベースに対して直接ストアドプロシージャコードを実行しようとすると、次のエラーが発生しました。 Msg 50000、レベル15、状態1、行1267 'mydatabase.sys.indexes'のデータベースおよび/またはサーバー名への参照は、このバージョンのSQL Serverではサポートされていません。 〜2700行のインデックスヒューリスティックロジックの内部動作をいじり始めるのに十分な自信がありません。このストアドプロシージャをAzure SQL Databaseで適切に動作させるための迅速かつ簡単な方法はありますか、それともインデックス分析ツール/ストアドプロシージャを他の場所で探す必要がありますか?

1
高可用性でのSQL Server 2012データベースの復元
別のインスタンスの別のデータベースと同期された、常時オンの高可用性モードのデータベースがあります。.bakを使用してファイルからプライマリデータベースに復元するにはどうすればよいT-SQLですか? 私は高可用性に不慣れであり、復元を行う前にデータベースを高可用性から削除してから再び高可用性に戻す必要があるとアドバイスされましたが、よくわかりません。 プライマリAlwaysOnがまだ有効であり、セカンダリと自動的に同期する間に、プライマリに直接復元できることを望んでいます。


3
T-SQLからの選択出力を非表示
クエリの実行時間を取得しようとしていますが、クエリの出力も非表示にします。経過時間だけが必要です-出力はありません。 例 DECLARE @Start datetime DECLARE @End datetime SELECT @StartTimeWA=GETDATE() SELECT [id] ,[database_id] ,[proc_name] ,[exec_t] from [DB].[dbo].[STAT] SELECT @End=GETDATE() SELECT DATEDIFF(MS,@Start,@End) AS [Duration] 現時点では、私は、クエリの出力を取得し、私は限り出力が行くようにしたい唯一のものです下の私の継続、で。私はこれを行うことができず、他の誰かが同様の問題に遭遇したかどうか疑問に思っていますか?これは、Management Studioやそのようなものではなく、T-SQLでやりたいことです。 selectステートメントを実行してサーバーに報告するのにかかる時間を監視しようとしています。私はそれを毎分実行し、時間を取り戻し(所要時間)、時間とともにトレンド/ベースラインに使用する外部モニターサーバーを持っています。現在のクエリは選択結果と私の継続時間を吐き出すので、それはそれを歪め、私の監視サーバーは混乱します。期間の列が必要でした。また、挿入に対してもこれを行います。これは、選択を実行する必要がないため簡単です。 私はこれを純粋にT-SQLでやろうとしています。クエリを実行するときにかかる時間(スナップショット)を取得し、サーバーがさまざまなレベルの負荷を通過するときにこれが変化するかどうかを確認したいので、DMVを使用したくないクエリの実行時間が変わるかどうか。
13 sql-server  t-sql 

2
CTEをセミコロンで開始する必要があるのはなぜですか?
Aaron Bertrandが数値テーブルの代わりにCTEを使用することを提案しているStackOverflowの投稿を見ているところです。私の質問は、なぜCTEの最初の行がセミコロンで始まるのですか? ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look ma, no gaps! これは、WITHステートメントが以前のSELECT何かに解析されないようにするためですか?WITHの前にセミコロンを使用することについて、SQL Server 2005 BOLには何も表示されません。
13 sql-server  t-sql  cte  syntax 


1
SQL Server / T-SQLは長い文字列を分割するために行継続をサポートしていますか?
私は、1つ以上の非常に長い(時には愚かな長い)文字列を含むSQLスクリプトを使用していることがあります。通常、これらはVARBINARYファイル/アセンブリを表すリテラル/定数ですが、テキストの場合もあります。 本当に長い文字列の主な問題は、一部のテキストエディターでは文字列をうまく処理できないことです。たとえばVARBINARY、CREATE ASSEMBLY [AssemblyName] FROM 0x....ステートメントで使用するリテラルがあり、アセンブリ自体のサイズは1 MBをわずかに超えています。これは、各バイトが16進表記で表されるために2文字を必要とするため、テキストファイルでは200万文字を少し上回ります。 (例0x1F= a 1およびan F)。SQL Server Management Studio(SSMS)はこれをうまく処理せず、その行をスクロールしようとすると数秒間ハングします。実際、一部のバージョン(これがまだ発生するかどうかは不明)では、特定の長さの行が少なくとも1行あるスクリプトを開くと、長い行に関する警告が表示されることもあります。 2番目の問題は、ワードラップを有効にせずにエディターで使用したり、オンラインで投稿したりすると、フォーマットが複雑になることです。ここでの問題は、水平スクロールバーのスライダーが非常に狭く、通常は少しでもそれを移動すると、非超長いテキストがスクロールして見えなくなるということです。 現在、T-SQLはコマンドを改行またはセミコロンで終了しません(SQL Server 2005以降、セミコロンが推奨/推奨されています)。したがって、SQL Serverは各ステートメントを解析する方法を知っているので、いつ終了するかがわかるので、newline/ carriage-return+ だけで区切られた長い行を複数の行に分割するline-feedように見えるのは、不合理に見えません。しかし、これはどちらの場合でも機能しません。 PRINT 'Line1 Line2'; 戻り値([メッセージ]タブ): Line1 Line2 そして、改行はリテラル/定数内にあるので、それは十分に理にかなっています。しかし、これを行うことVARBINARYもできません。 PRINT 0x1234 5678; エラーが出ます。

2
SQL Serverの別のテーブルの値を使用してテーブルを更新する
データベースに2つのテーブルがあります。 表1 ------------------------------------------------------------------------- | name | family | phone | email | gender | phone2 | address | birthdate | ------------------------------------------------------------------------- テーブル#2 ----------------------------------------- | gender | address | phone | birthdate | ----------------------------------------- テーブル#1の列ではaddressとphone2は空で、列の性別と生年月日の値はテーブル#2と同じです。 どのように私はテーブル#2及び更新からデータを読み取ることができますアドレスとphone2のテーブル#2からの値を持つテーブル#1でのアドレスと電話するとき、列を性別と誕生日が各行に同じですか? 例:これは表#1の一部のデータです ------------------------------------------------------------------------- | name | family | phone | email | gender | phone2 | …

3
マスターを使用してデータベースを作成する理由
短い質問がありますが、なぜuse master;データベースの作成に使用するのですか?ここでの例は、Microsoftのドキュメントからは、 USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program Files\...\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\Program Files\...\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ;

5
冗長性をチェックするためにテーブルを削除せずに非表示/無効にする方法は?
使用されなくなったWebサービスメソッドとデータベーステーブルを含む古いレガシーシステムを維持および拡張する必要があります。テーブルが実際に冗長であるかどうかは完全にはわからないので、それらを削除することを恐れています。 それらを削除せずに同じ効果を達成する他の方法はありますか(テーブルはこれ以上使用できません)?私の考えは、それらをDeleted現在のデフォルトとは異なるスキーマ(例:)に転送することdboでした。 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; 他のオプションはありますか、スキーマアプローチには欠点がありますか?

2
条件付きINSERTおよびSELECTよりもOUTPUTを使用したMERGEの方が良いでしょうか?
多くの場合、「存在しない場合は挿入」という状況が発生します。Dan Guzmanのブログには、このプロセスをスレッドセーフにする方法に関する優れた調査があります。 文字列をから整数に単純にカタログする基本的なテーブルがありSEQUENCEます。ストアドプロシージャでは、値の整数キーが存在する場合は取得するか、値の整数キーをINSERT取得してから結果の値を取得する必要があります。dbo.NameLookup.ItemName列には一意性の制約があるため、データの整合性は危険にさらされていませんが、例外は発生しません。 それはIDENTITYそうではないので、私は得ることができず、特定の場合にSCOPE_IDENTITYは値がありますNULL。 私の状況INSERTでは、テーブルの安全性だけを扱う必要があるため、次のMERGEように使用するのがより良い方法かどうかを判断しようとしています。 SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item ON f.ItemName= new_item.val WHEN MATCHED THEN UPDATE SET …

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