2017-12-08 8 views
0

私はクエリストアに対して、次のクエリで働いている:SQL Serverクエリストア:[sys.query_store_query_text]。[query_sql_text]が切り捨てられていますか?

SELECT 
TOP 100 
    qp.last_execution_time [qp__last_execution_time], 
    qt.query_sql_text, 
    len(qt.query_sql_text) sql_length,  
    round(rs.avg_duration ,5) avg_duration 
    ,max_rowcount,avg_rowcount,last_rowcount 
FROM 
    sys.query_store_plan qp 
    INNER JOIN sys.query_store_query   [q]  ON qp.query_id = q.query_id 
    INNER JOIN sys.query_store_query_text [qt]  ON q.query_text_id = qt.query_text_id 
    INNER JOIN sys.query_store_runtime_stats [rs]  ON qp.plan_id = rs.plan_id 
WHERE 
order by len(qt.query_sql_text) desc 

私は気づい何が、[query_sql_text]が切り捨てられているようだということです例えば、典型的な声明はで終了します:

CAST('20170920 00:00:00' AS datetime),CAST('20140701 00:00: 

おそらく関連:
この場合、SQLは、電源BIによって生成されています。
テキストが切り捨てられたとき、len(qt.query_sql_text)は同じ値で最大値になりません。
SSMSの結果ペインからメモ帳にコピー/貼り付けしてSQLを表示しています。

SQLバージョン:マイクロソフトSQL Azureの(RTM) - 12.0.2000.8 2017年8月29日午後01時06分11秒

私は、SQL ServerはSQLを切り捨てることを他のいくつかの "システムテーブル" に思い出します。

これは質問です。[sys.query_store_query_text]。[query_sql_text]がSQL Server自体によって切り捨てられることがあるかどうかは誰でも分かりますか?

クライアントアプリケーションで起こっているトランケーションは、完全な有効なSQL文をSQL Serverに送信する必要があるため、それ以外の方法では実行できません。しかし、len(query_sql_text)の違いは、列の長さの制限を超えることを排除します。

ここで何が起こっているのでしょうか?

+1

返された結果を切り捨てるSSMSです。 [オプション] - > [クエリ結果] - > [SQL Server] - > [結果をグリッド/テキストにする]、[最大文字数]オプションで最大長を確認できます。 –

+0

結果をGridにするために、私は非XMLデータ= 65535(それはそれが行くほど高い)です。しかし、切り詰めの場合のlen(qt.query_sql_text)は61862と61771のような値を持ちます。切り詰めを実行するSSMSの場合、切り捨てられたSQLの長さは同じではないでしょうか? – tbone

+0

わかりません。提案されているようにXMLにキャストしてみてください。そうであれば、それはSSMSの切り詰めです。 –

答えて

2

データグリッドにデータを返すとき、SSMSはBLOB結果を切り捨てます。クエリオプションで長さを変更するか、データをXMLとして返すことができます。 EG

SELECT 
TOP 100 
    qp.last_execution_time [qp__last_execution_time], 
    qt.query_sql_text, 
    len(qt.query_sql_text) sql_length,  
    round(rs.avg_duration ,5) avg_duration 
    ,max_rowcount,avg_rowcount,last_rowcount 
FROM 
    sys.query_store_plan qp 
    INNER JOIN sys.query_store_query   [q]  ON qp.query_id = q.query_id 
    INNER JOIN sys.query_store_query_text [qt]  ON q.query_text_id = qt.query_text_id 
    INNER JOIN sys.query_store_runtime_stats [rs]  ON qp.plan_id = rs.plan_id 
order by len(qt.query_sql_text) desc 
for xml path 

または別のXML列に各クエリを取得する:

SELECT 
TOP 100 
    qp.last_execution_time [qp__last_execution_time], 
    (select qt.query_sql_text for xml path, type) query_sql_text, 
    len(qt.query_sql_text) sql_length,  
    round(rs.avg_duration ,5) avg_duration 
    ,max_rowcount,avg_rowcount,last_rowcount 
FROM 
    sys.query_store_plan qp 
    INNER JOIN sys.query_store_query   [q]  ON qp.query_id = q.query_id 
    INNER JOIN sys.query_store_query_text [qt]  ON q.query_text_id = qt.query_text_id 
    INNER JOIN sys.query_store_runtime_stats [rs]  ON qp.plan_id = rs.plan_id 

order by len(qt.query_sql_text) desc 

またはSSMSでXEvents UIからクエリテキストを取得します。

+0

ツール、オプション、クエリ結果、SQL Server、グリッドへの結果、非XMLデータの最大文字数は65535です(これは最高です)。しかし、切り詰めの場合のlen(qt.query_sql_text)は61862と61771のような値を持ちます。切り詰めを実行するSSMSの場合、切り捨てられたSQLの長さは同じではないでしょうか? (別の設定について話しているかもしれませんが、それでも一定の長さで切り捨てるべきではないでしょうか?) – tbone

+0

"for xml path"を追加すると、完全なSQLを見ることができます。素晴らしいボーナス。私はまだtruncation中にlen(query_sql_text)の分散が不思議です。しかし、もっと重要なのは、私は今、すべてのSQL結果をまとめることを得ています。 "for XML Path"を行単位で行うことができますか? – tbone

+0

SSMSのように、グリッド結果のテキストからCR LFのような空白文字を取り除くので、長さの違いを考慮に入れることができます。そして、はい、XMLは行ごとにすることができます。上記の追加の例を参照してください: –

関連する問題