{"id":113726,"date":"2026-10-07T08:49:16","date_gmt":"2026-10-07T00:49:16","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/113726.html"},"modified":"2026-10-07T08:49:16","modified_gmt":"2026-10-07T00:49:16","slug":"sql-dynamic-query-building-in-sql-techniques-security-and-best-practices-using-sql-server-2025","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/113726.html","title":{"rendered":"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025"},"content":{"rendered":"<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   SQL Server 2025 \u2014 \u52a8\u6001 SQL \u6784\u5efa&#xff1a;\u6280\u672f\u3001\u5b89\u5168\u4e0e\u6700\u4f73\u5b9e\u8df5<br \/>\n   Dynamic Query Building in SQL: Techniques, Security, and Best Practices<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n   \u4e3b\u9898&#xff1a;\u7528\u53c2\u6570\u5316\u67e5\u8be2\u3001\u5b58\u50a8\u8fc7\u7a0b\u3001\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668\u4e0e\u6ce8\u5165\u9632\u62a4&#xff0c;\u5b89\u5168\u5730\u6784\u5efa\u52a8\u6001 SQL<br \/>\n   \u884c\u4e1a&#xff1a;\u56fd\u9645\u5316\u73e0\u5b9d\u884c\u4e1a ERP \/ CRM \/ HR&#xff08;\u4e03\u56fd&#xff1a;CN HK US JP SG FR AE&#xff09;<br \/>\n   \u76ee\u6807&#xff1a;SQL Server 2025 (17.0.1135.8) Enterprise Edition<br \/>\n   \u573a\u666f&#xff1a;\u4e07\u4ebf\u884c\u6570\u636e\u91cf\u7ea7 &#043; \u9ad8\u5e76\u53d1 OLTP\/OLAP \u6df7\u5408<\/p>\n<p>   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   \u3010\u672c\u811a\u672c\u7684\u4e5d\u6761\u6838\u5fc3\u7ed3\u8bba\u3011&#xff08;\u5148\u8bfb\u8fd9\u91cc&#xff0c;\u518d\u8bfb\u4ee3\u7801&#xff09;<br \/>\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   1. \u52a8\u6001 SQL \u672c\u8eab\u4e0d\u5371\u9669&#xff0c;\u300c\u62fc\u63a5\u300d\u624d\u5371\u9669\u3002\u5371\u9669\u7684\u4e0d\u662f EXEC()&#xff0c;\u662f\u628a\u7528\u6237\u8f93\u5165<br \/>\n      \u5f53\u6210 SQL \u4ee3\u7801\u62fc\u8fdb\u53bb\u3002\u53c2\u6570\u5316\u540e&#xff0c;\u52a8\u6001 SQL \u4e0e\u9759\u6001 SQL \u7684\u5b89\u5168\u6027\u7b49\u4ef7\u3002<br \/>\n   2. EXEC(&#064;sql) \u4e0d\u63a5\u53d7\u53c2\u6570 \u2192 \u53ea\u80fd\u62fc\u63a5 \u2192 \u8fd9\u662f\u6ce8\u5165\u7684\u7b2c\u4e00\u5165\u53e3\u3002<br \/>\n      sp_executesql \u63a5\u53d7\u53c2\u6570 \u2192 \u503c\u8d70\u53c2\u6570\u901a\u9053&#xff0c;\u6c38\u8fdc\u4e0d\u8fdb\u89e3\u6790\u5668\u3002<br \/>\n      \u2605 \u7ed3\u8bba&#xff1a;\u80fd\u7528 sp_executesql \u5c31\u4e0d\u8981\u7528 EXEC\u3002<br \/>\n   3. \u4f46 sp_executesql \u53ea\u80fd\u53c2\u6570\u5316\u3010\u503c\u3011&#xff0c;\u53c2\u6570\u5316\u4e0d\u4e86\u3010\u6807\u8bc6\u7b26\u3011\u3002<br \/>\n      \u8868\u540d\/\u5217\u540d\/ORDER BY\/\u65b9\u5411 \u5fc5\u987b\u8d70\u3010\u767d\u540d\u5355\u6620\u5c04\u3011&#xff0c;\u7edd\u4e0d\u80fd\u76f4\u63a5\u62fc\u3002<br \/>\n   4. QUOTENAME \u662f\u6807\u8bc6\u7b26\u8f6c\u4e49\u7684\u6b63\u786e\u5de5\u5177&#xff0c;\u4e14\u5fc5\u987b\u6307\u5b9a\u7b2c\u4e8c\u4e2a\u53c2\u6570&#xff08;\u5f15\u53f7\u7c7b\u578b&#xff09;\u3002<br \/>\n      \u53ea\u5199 QUOTENAME(&#064;x) \u9ed8\u8ba4\u7528 [] \u800c\u4e0d\u7ba1\u5185\u5bb9\u662f &#039; \u8fd8\u662f &#034;&#xff0c;\u5bb9\u6613\u6f0f\u3002<br \/>\n   5. \u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668&#xff08;&#034;\u4efb\u610f\u7ec4\u5408\u7684\u67e5\u8be2\u6761\u4ef6&#034;&#xff09;\u6709\u4e24\u6761\u8def&#xff1a;<br \/>\n      \u9759\u6001 SQL &#043; (col &#061; &#064;p OR &#064;p IS NULL)  \u2014\u2014 \u8ba1\u5212\u7a33\u5b9a&#xff0c;\u7d22\u5f15\u53ef\u80fd\u7528\u4e0d\u6ee1<br \/>\n      \u52a8\u6001 SQL &#043; \u53ea\u62fc\u51fa\u73b0\u8fc7\u7684\u6761\u4ef6        \u2014\u2014 \u8ba1\u5212\u6700\u4f18&#xff0c;\u4f46\u8981\u53c2\u6570\u5316 &#043; \u767d\u540d\u5355<br \/>\n      \u2605 \u4e07\u4ebf\u7ea7\u9ad8\u5e76\u53d1\u4e0b\u63a8\u8350\u540e\u8005&#xff0c;\u914d\u5408 sp_executesql \u590d\u7528\u8ba1\u5212\u3002<br \/>\n   6. \u8ba1\u5212\u7f13\u5b58\u7684\u7c92\u5ea6\u662f\u3010\u5b8c\u6574\u8bed\u53e5\u5b57\u7b26\u4e32\u3011\u3002\u52a8\u6001 SQL \u62fc\u63a5\u65f6\u53ea\u8981\u6709\u4e00\u4e2a\u5b57\u9762\u91cf<br \/>\n      \u4e0d\u540c&#xff0c;\u5c31\u662f\u4e00\u6761\u5168\u65b0\u7684\u8bed\u53e5 \u2192 \u7f13\u5b58\u7206\u70b8&#xff08;Adhoc \u8ba1\u5212\u6cdb\u6ee5&#xff09;\u3002<br \/>\n      \u2605 \u5bf9\u7b56&#xff1a;\u53c2\u6570\u5316 &#043; \u89c4\u8303\u5316 &#043; \u5fc5\u8981\u65f6 optimize for ad hoc workloads\u3002<br \/>\n   7. \u6ce8\u5165\u9632\u5fa1\u662f\u7eb5\u6df1\u4f53\u7cfb&#xff0c;\u4e0d\u662f\u5355\u70b9&#xff1a;\u53c2\u6570\u5316&#xff08;\u7b2c\u4e00\u5c42&#xff09;&#043; \u767d\u540d\u5355&#xff08;\u7b2c\u4e8c\u5c42&#xff09;&#043;<br \/>\n      \u6700\u5c0f\u6743\u9650&#xff08;\u7b2c\u4e09\u5c42&#xff09;&#043; \u6a21\u5757\u7b7e\u540d\/EXECUTE AS&#xff08;\u7b2c\u56db\u5c42&#xff09;&#043; \u76d1\u63a7\u5ba1\u8ba1&#xff08;\u7b2c\u4e94\u5c42&#xff09;\u3002<br \/>\n   8. \u6743\u9650\u4e0a&#xff0c;\u52a8\u6001 SQL \u5728\u3010\u8c03\u7528\u8005\u3011\u4e0a\u4e0b\u6587\u6267\u884c\u3002EXECUTE AS OWNER &#043; \u6a21\u5757\u7b7e\u540d<br \/>\n      \u53ef\u4ee5\u505a\u5230&#034;\u53ea\u7ed9 EXECUTE \u6743\u9650&#xff0c;\u4e0d\u7ed9\u57fa\u8868\u6743\u9650&#034;\u2014\u2014\u8fd9\u662f\u6743\u9650\u6700\u5c0f\u5316\u7684\u5173\u952e\u3002<br \/>\n   9. \u4e07\u4ebf\u7ea7\u573a\u666f\u7684\u52a8\u6001 SQL \u8fd8\u5f97\u89e3\u51b3&#xff1a;\u5206\u533a\u88c1\u526a&#xff08;\u62fc\u5206\u533a\u952e&#xff09;\u3001\u952e\u96c6\u5206\u9875&#xff08;\u907f\u514d<br \/>\n      OFFSET \u6df1\u7ffb\u9875&#xff09;\u3001\u4ee5\u53ca&#034;\u52a8\u6001 SQL \u6c38\u8fdc\u4e0d\u4f1a\u88ab\u81ea\u52a8\u53c2\u6570\u5316&#034;\u5e26\u6765\u7684\u7f13\u5b58\u538b\u529b\u3002<\/p>\n<p>   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   \u3010\u6700\u5bb9\u6613\u8e29\u7684 11 \u4e2a\u5751\u3011&#xff08;\u672c\u673a SQL Server 2025 \u5b9e\u6d4b\u590d\u73b0&#xff09;<br \/>\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   \u5751 1  EXEC \u62fc\u63a5\u5b57\u7b26\u4e32\u65f6&#xff0c;\u65e5\u671f\/\u5b57\u7b26\u4e32\u5fc5\u987b\u81ea\u5e26\u5f15\u53f7&#xff1a;EXEC(&#039;&#8230;&#061;&#039;&#039;&#039; &#043; &#064;d &#043; &#039;&#039;&#039;&#039;)<br \/>\n        \u6f0f\u4e86\u5f15\u53f7 \u2192 \u8bed\u6cd5\u9519\u8bef 156 \u6216\u66f4\u7cdf&#xff1a;\u9759\u9ed8\u6267\u884c\u4e86\u9519\u8bef\u7684\u8bed\u53e5\u3002<br \/>\n   \u5751 2  sp_executesql \u7684\u53c2\u6570\u540d\u5fc5\u987b\u5e26 &#064;&#xff0c;\u4e14\u987a\u5e8f\/\u7c7b\u578b\u8981\u4e0e SQL \u6587\u672c\u4e00\u81f4\u3002<br \/>\n        \u5e38\u89c1\u9519\u8bef&#xff1a;\u628a N&#039;&#064;c&#039; \u5199\u6210 N&#039;c&#039; \u2192 \u62a5 214&#xff08;\u8fc7\u7a0b\u9700\u8981\u53c2\u6570&#xff09;\u3002<br \/>\n   \u5751 3  sp_executesql \u7684 SQL \u6587\u672c\u5fc5\u987b\u662f nvarchar&#xff08;N&#039;&#8230;&#039;&#xff09;\u3002\u5199\u6210 varchar<br \/>\n        \u4f1a\u8ba9\u4e2d\u6587\u5b57\u7b26\u4e32\u53d8\u6210 &#039;?&#039;&#xff0c;\u4e14\u53ef\u80fd\u62a5 214 \u7c7b\u578b\u4e0d\u5339\u914d\u3002<br \/>\n   \u5751 4  QUOTENAME \u53ea\u9632\u6807\u8bc6\u7b26&#xff0c;\u4e0d\u9632\u503c\u3002QUOTENAME(&#039;a&#039;&#039;;DROP&#8211;&#039;) \u8fd4\u56de\u7684\u4ecd\u662f<br \/>\n        \u5e26\u5f15\u53f7\u7684\u539f\u4e32&#xff0c;\u82e5\u62ff\u5b83\u53bb\u62fc\u3010\u503c\u3011\u4f4d\u7f6e\u6beb\u65e0\u610f\u4e49&#xff0c;\u8fd8\u4f1a\u9020\u6210\u9519\u8bef\u7684\u5b89\u5168\u611f\u3002<br \/>\n   \u5751 5  ORDER BY \u91cc\u62fc\u5217\u540d&#xff0c;\u5373\u4f7f QUOTENAME \u4e86&#xff0c;\u4e5f\u80fd\u901a\u8fc7\u6ce8\u5165\u5df2\u6709\u7684\u5408\u6cd5\u5217\u540d<br \/>\n        \u505a&#034;\u76f2\u6ce8\u6392\u5e8f&#034;&#xff08;\u4f8b\u5982\u63a2\u6d4b\u67d0\u5217\u662f\u5426\u5b58\u5728&#xff09;\u3002\u5fc5\u987b\u767d\u540d\u5355\u3002<br \/>\n   \u5751 6  SELECT &#8230; FROM &#039; &#043; QUOTENAME(&#064;tbl) \u770b\u8d77\u6765\u5b89\u5168&#xff0c;\u4f46\u5982\u679c &#064;tbl \u6765\u81ea<br \/>\n        \u7528\u6237\u4e14\u672a\u505a\u767d\u540d\u5355&#xff0c;SQL Server \u7684\u3010\u5ef6\u8fdf\u540d\u79f0\u89e3\u6790\u3011\u4f1a\u8ba9\u4f60\u5728\u8fd0\u884c\u671f\u624d<br \/>\n        \u53d1\u73b0\u8868\u4e0d\u5b58\u5728&#xff08;\u751a\u81f3\u89e6\u53d1\u6743\u9650\u63a2\u6d4b&#xff09;\u3002\u5fc5\u987b\u767d\u540d\u5355\u3002<br \/>\n   \u5751 7  \u52a8\u6001 SQL \u9ed8\u8ba4\u5728\u3010\u8c03\u7528\u8005\u3011\u6743\u9650\u4e0b\u8fd0\u884c&#xff0c;\u6743\u9650\u4e0d\u7ee7\u627f\u5b58\u50a8\u8fc7\u7a0b\u7684\u3002<br \/>\n        \u60f3\u8ba9\u666e\u901a\u7528\u6237\u67e5\u57fa\u8868&#xff0c;\u9700\u8981 EXECUTE AS OWNER \u6216\u6a21\u5757\u7b7e\u540d&#xff0c;\u5426\u5219\u62a5 229\u3002<br \/>\n   \u5751 8  \u53c2\u6570\u5316\u540e\u3010\u53c2\u6570\u55c5\u63a2\u3011\u4f9d\u7136\u5b58\u5728&#xff1a;\u52a8\u6001 SQL \u7528 sp_executesql \u4f20\u53c2&#xff0c;<br \/>\n        \u540c\u6837\u4f1a\u6309\u9996\u6b21\u6267\u884c\u7684\u503c\u751f\u6210\u8ba1\u5212\u3002\u5927\u6570\u636e\u91cf\u503e\u659c\u5217\u4e0a\u8981 OPTION(RECOMPILE)<br \/>\n        \u6216 OPTIMIZE FOR\u3002<br \/>\n   \u5751 9  \u2605 \u672c\u673a\u5b9e\u6d4b&#xff1a;REGEXP_LIKE \u662f\u3010\u8c13\u8bcd\u3011\u4e0d\u662f\u4e00\u4e2a\u6807\u91cf\u51fd\u6570\u3002<br \/>\n        \u5b83\u53ea\u80fd\u5728 WHERE \/ CASE WHEN \/ IF \/ EXISTS \u7b49\u5e03\u5c14\u4e0a\u4e0b\u6587\u91cc\u7528&#xff1b;<br \/>\n        \u653e\u8fdb SELECT \u5217\u8868\u3001SET &#064;v &#061;\u3001\u6216\u6d3e\u751f\u8868\u6295\u5f71\u91cc\u4f1a\u62a5<br \/>\n        \u300c\u6d88\u606f 156 \u5173\u952e\u5b57 &#039;REGEXP_LIKE&#039; \u9644\u8fd1\u6709\u8bed\u6cd5\u9519\u8bef\u300d\u3002<br \/>\n        \u800c REGEXP_COUNT \/ REGEXP_REPLACE \/ REGEXP_SUBSTR \u8fd4\u56de\u6807\u91cf&#xff0c;<br \/>\n        \u5728\u4efb\u4f55\u4f4d\u7f6e\u90fd\u80fd\u7528\u3002\u7528\u5b83\u505a\u8f93\u5165\u5408\u6cd5\u6027\u6821\u9a8c\u65f6\u52a1\u5fc5\u6ce8\u610f\u4f4d\u7f6e\u3002<br \/>\n   \u5751 10 \u2605 \u672c\u673a\u5b9e\u6d4b&#xff1a;RowCount \u5728 SQL Server 2025 \u91cc\u662f\u3010\u4fdd\u7559\u5173\u952e\u5b57\u3011\u3002<br \/>\n        \u4f5c\u4e3a\u5217\u540d\/\u522b\u540d\u5fc5\u987b\u5199\u6210 [RowCount]&#xff0c;\u5426\u5219\u62a5<br \/>\n        \u300c\u6d88\u606f 156 \u5173\u952e\u5b57 &#039;RowCount&#039; \u9644\u8fd1\u6709\u8bed\u6cd5\u9519\u8bef\u300d\u3002\u540c\u7c7b\u8fd8\u6709 LineNo\u3001<br \/>\n        Rule&#xff08;CASCADE\/RULE \u76f8\u5173&#xff09;\u7b49\u65b0\u589e\u4fdd\u7559\u5b57&#xff0c;\u547d\u540d\u524d\u5148\u67e5\u4e00\u904d\u3002<br \/>\n   \u5751 11 \u2605 \u672c\u673a\u5b9e\u6d4b\u7684\u4e09\u4e2a sp_executesql \u53c2\u6570\u9519\u8bef\u7801&#xff0c;\u52a1\u5fc5\u5206\u6e05&#xff1a;<br \/>\n        \u00b7 \u58f0\u660e\u4e32\u6f0f\u5199 &#064;&#xff08;\u5982 &#039;cc char(2)&#039;&#xff09;\u2192 \u62a5 102&#xff08;\u8bed\u6cd5\u9519\u8bef&#xff09;&#xff0c;\u4e0d\u662f 214<br \/>\n        \u00b7 \u5b9e\u53c2\u591a\u4f20\u4e00\u4e2a\u4e0d\u5728\u58f0\u660e\u4e32\u91cc\u7684\u547d\u540d\u53c2\u6570 \u2192 \u62a5 8144&#xff08;\u6307\u5b9a\u4e86\u8fc7\u591a\u7684\u53c2\u6570&#xff09;<br \/>\n        \u00b7 \u628a\u5916\u5c42\u53d8\u91cf\u540d\u5199\u8fdb&#034;\u5b9e\u53c2\u5b57\u7b26\u4e32&#034;\u91cc \u2192 \u62a5 134&#xff08;\u53d8\u91cf\u540d\u5fc5\u987b\u552f\u4e00&#xff09;<br \/>\n        \u00b7 \u540c\u4e00\u6279\u6b21\u91cd\u590d DECLARE \u540c\u4e00\u53d8\u91cf\u540d \u2192 \u4e5f\u62a5 134&#xff08;\u53d8\u91cf\u540d\u5fc5\u987b\u552f\u4e00&#xff09;<br \/>\n        \u00b7 SQL \u6587\u672c\u91cc\u7528\u4e86\u672a\u58f0\u660e\u7684 &#064;param \u2192 \u62a5 137&#xff08;\u5fc5\u987b\u58f0\u660e\u6807\u91cf\u53d8\u91cf&#xff09;<\/p>\n<p>   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   \u3010\u6267\u884c\u65b9\u5f0f\u3011<br \/>\n     sqlcmd -S &#034;localhost\\\\SQL2025&#034; -E -d JewelryAnalytics -l 60 -t 900 ^<br \/>\n            -f &#034;i:65001,o:65001&#034; -y 0 -i SQLServer2025_DynamicSQL_JewelryDemo.sql ^<br \/>\n            -o SQLServer2025_DynamicSQL_\u9a8c\u8bc1\u8f93\u51fa.txt<br \/>\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550<br \/>\n   \u672c\u811a\u672c\u53ef\u91cd\u590d\u6267\u884c&#xff08;\u5e42\u7b49&#xff09;&#xff1a;00-B \u8282\u8d1f\u8d23\u6e05\u7406&#xff0c;\u672b\u5c3e\u4e0d\u9057\u7559\u810f\u5bf9\u8c61\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u3010\u7edf\u4e00 SET \u9009\u9879\u3011<br \/>\n   &#8211; QUOTED_IDENTIFIER ON&#xff1a;\u4f7f\u7528 &#034;&#034; \u4f5c\u4e3a\u6807\u8bc6\u7b26\u5f15\u53f7&#xff0c;XML \u65b9\u6cd5\u4e0e\u90e8\u5206\u8bed\u6cd5\u8981\u6c42 ON<br \/>\n   &#8211; ANSI_NULLS ON&#xff1a;\u4e0e\u5927\u591a\u6570\u5ba2\u6237\u7aef\u9a71\u52a8\u4e00\u81f4&#xff0c;\u907f\u514d IS NULL \u8bed\u4e49\u6b67\u4e49<br \/>\n   &#8211; XACT_ABORT ON&#xff1a;\u8fd0\u884c\u65f6\u9519\u8bef\u56de\u6eda\u6574\u4e2a\u4e8b\u52a1&#xff0c;\u907f\u514d\u534a\u6210\u54c1\u72b6\u6001<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nSET NOCOUNT ON;<br \/>\nSET QUOTED_IDENTIFIER ON;<br \/>\nSET ANSI_NULLS ON;<br \/>\nSET XACT_ABORT ON;<br \/>\nSET ANSI_PADDING ON;<br \/>\nSET ANSI_WARNINGS ON;<br \/>\nSET ARITHABORT ON;<br \/>\nSET CONCAT_NULL_YIELDS_NULL ON;<br \/>\nSET NUMERIC_ROUNDABORT OFF;<br \/>\nGO<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;###################################################################&#039;;<br \/>\nPRINT N&#039;##  SQL Server 2025 \u2014 \u52a8\u6001 SQL \u6784\u5efa&#xff1a;\u6280\u672f\u3001\u5b89\u5168\u4e0e\u6700\u4f73\u5b9e\u8df5            ##&#039;;<br \/>\nPRINT N&#039;##  \u56fd\u9645\u5316\u73e0\u5b9d\u884c\u4e1a ERP \/ CRM \/ HR \u793a\u4f8b \u00b7 \u4e07\u4ebf\u7ea7\u9ad8\u5e76\u53d1\u573a\u666f            ##&#039;;<br \/>\nPRINT N&#039;###################################################################&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301000\u3011\u73af\u5883\u786e\u8ba4 \u2014 \u5148\u770b\u6e05\u811a\u4e0b\u7684\u5730<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u52a8\u6001 SQL \u7684\u884c\u4e3a\u9ad8\u5ea6\u4f9d\u8d56\u5b9e\u4f8b\u914d\u7f6e\u4e0e\u6570\u636e\u5e93\u9009\u9879&#xff1a;<br \/>\n     \u00b7 \u517c\u5bb9\u7ea7\u522b       \u2192 \u51b3\u5b9a REGEXP_* \u7b49\u65b0\u51fd\u6570\u662f\u5426\u53ef\u7528<br \/>\n     \u00b7 CTFP \/ MAXDOP  \u2192 \u51b3\u5b9a\u52a8\u6001 SQL \u5e76\u884c\u4e0e\u5426<br \/>\n     \u00b7 Query Store    \u2192 \u52a8\u6001 SQL \u7684\u8ba1\u5212\u80fd\u5426\u88ab\u6355\u83b7\u4e0e\u5f3a\u5236<br \/>\n     \u00b7 \u5185\u5b58           \u2192 \u51b3\u5b9a\u80fd\u5426\u627f\u53d7\u8ba1\u5212\u7f13\u5b58\u7206\u70b8<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301000\u3011\u73af\u5883\u786e\u8ba4&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>SELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u5b9e\u4f8b\u7248\u672c&#039;,<br \/>\n    \u503c   &#061; CAST(SERVERPROPERTY(&#039;ProductVersion&#039;) AS nvarchar(40)) &#043; N&#039; \/ &#039;<br \/>\n         &#043; CAST(SERVERPROPERTY(&#039;Edition&#039;) AS nvarchar(60));<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u5f53\u524d\u6570\u636e\u5e93 \/ \u517c\u5bb9\u7ea7\u522b&#039;,<br \/>\n    \u503c   &#061; DB_NAME() &#043; N&#039; \/ &#039; &#043; CAST(<br \/>\n              (SELECT compatibility_level FROM sys.databases WHERE name &#061; DB_NAME())<br \/>\n              AS nvarchar(10));<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u7269\u7406\u5185\u5b58 MB \/ \u53ef\u7528 MB \/ SQL \u8fdb\u7a0b MB&#039;,<br \/>\n    \u503c   &#061; CAST((SELECT total_physical_memory_kb\/1024 FROM sys.dm_os_sys_memory) AS nvarchar(20))<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST((SELECT available_physical_memory_kb\/1024 FROM sys.dm_os_sys_memory) AS nvarchar(20))<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST((SELECT physical_memory_in_use_kb\/1024 FROM sys.dm_os_process_memory) AS nvarchar(20));<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;CTFP \/ MAXDOP \/ \u6700\u5927\u670d\u52a1\u5668\u5185\u5b58 MB&#039;,<br \/>\n    \u503c   &#061; CAST((SELECT value_in_use FROM sys.configurations WHERE name&#061;&#039;cost threshold for parallelism&#039;) AS nvarchar(10))<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST((SELECT value_in_use FROM sys.configurations WHERE name&#061;&#039;max degree of parallelism&#039;) AS nvarchar(10))<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST((SELECT value_in_use FROM sys.configurations WHERE name&#061;&#039;max server memory (MB)&#039;) AS nvarchar(20));<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;RCSI \/ \u5feb\u7167\u9694\u79bb&#039;,<br \/>\n    \u503c   &#061; CASE WHEN is_read_committed_snapshot_on &#061; 1 THEN N&#039;ON&#039; ELSE N&#039;OFF&#039; END<br \/>\n         &#043; N&#039; \/ &#039; &#043; CASE WHEN snapshot_isolation_state_desc &#061; N&#039;ON&#039; THEN N&#039;ON&#039; ELSE N&#039;OFF&#039; END<br \/>\nFROM sys.databases WHERE name &#061; DB_NAME();<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;Query Store \u72b6\u6001 \/ \u53ea\u8bfb\u539f\u56e0 \/ \u5360\u7528 MB&#039;,<br \/>\n    \u503c   &#061; actual_state_desc<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST(readonly_reason AS nvarchar(20))<br \/>\n         &#043; N&#039; \/ &#039; &#043; CAST(current_storage_size_mb AS nvarchar(20))<br \/>\nFROM sys.database_query_store_options;<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u73af\u5883\u63d0\u793a&#xff1a;\u52a8\u6001 SQL \u7684\u8ba1\u5212\u7f13\u5b58\u4f1a\u5360\u7528\u5185\u5b58\u3002\u672c\u673a\u4e3a 32 GB \u7269\u7406\u5185\u5b58&#039;;<br \/>\nPRINT N&#039;    \u5171\u4eab\u73af\u5883&#xff0c;\u6545\u672c\u811a\u672c\u6240\u6709\u6f14\u793a\u5747\u4f7f\u7528\u3010\u5c0f\u7ed3\u679c\u96c6 &#043; \u5355\u6708\/\u5355\u5e97\u8303\u56f4\u3011&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u907f\u514d\u89e6\u53d1\u9519\u8bef 701&#xff08;\u8d44\u6e90\u6c60 internal \u5185\u5b58\u4e0d\u8db3&#xff09;\u3002&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301000-B\u3011\u5e42\u7b49\u6e05\u7406 \u2014 \u8ba9\u811a\u672c\u53ef\u4ee5\u53cd\u590d\u6267\u884c<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u6e05\u7406\u987a\u5e8f&#xff1a;\u5148\u5220&#034;\u88ab\u5f15\u7528\u8005&#034;\u518d\u5220&#034;\u5f15\u7528\u8005&#034;&#xff0c;\u5148\u5220\u7d22\u5f15\u518d\u5220\u8868\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301000-B\u3011\u5e42\u7b49\u6e05\u7406&#xff08;\u53ef\u53cd\u590d\u6267\u884c&#xff09;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212; \u5b58\u50a8\u8fc7\u7a0b &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- *\/<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SearchOrders_Static;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SearchOrders_Dynamic;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SearchOrders_Unsafe;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SearchByRuntimeFilters;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_ReportSafe;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SignedRead;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_PagingKeyset;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_Demo_Injection;<br \/>\nPRINT N&#039;  \u00b7 \u5b58\u50a8\u8fc7\u7a0b\u6e05\u7406\u5b8c\u6210&#039;;<\/p>\n<p>\/* &#8212; \u51fd\u6570 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nDROP FUNCTION IF EXISTS dbo.fn_Dyn_IsSafeIdentifier;<br \/>\nDROP FUNCTION IF EXISTS dbo.fn_Dyn_QuoteValue;<br \/>\nPRINT N&#039;  \u00b7 \u51fd\u6570\u6e05\u7406\u5b8c\u6210&#039;;<\/p>\n<p>\/* &#8212; \u89c6\u56fe &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nDROP VIEW IF EXISTS dbo.vw_Dyn_OrderSummary;<br \/>\nPRINT N&#039;  \u00b7 \u89c6\u56fe\u6e05\u7406\u5b8c\u6210&#039;;<\/p>\n<p>\/* &#8212; \u666e\u901a\u8868&#xff08;\u6309\u4f9d\u8d56\u5012\u5e8f&#xff09;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_AuditLog;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_SearchLog;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_PlanSnapshot;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_ResultCheck;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_AllowedColumn;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_AllowedTable;<br \/>\nDROP TABLE IF EXISTS dbo.Dyn_InjectionDemo;<br \/>\nPRINT N&#039;  \u00b7 \u6570\u636e\u8868\u6e05\u7406\u5b8c\u6210&#039;;<\/p>\n<p>\/* &#8212; \u8bc1\u4e66 \/ \u5bf9\u79f0\u5bc6\u94a5&#xff08;\u6a21\u5757\u7b7e\u540d\u7528&#xff09;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nIF EXISTS (SELECT 1 FROM sys.certificates WHERE name &#061; N&#039;Cert_Dyn_SignedReader&#039;)<br \/>\n    DROP CERTIFICATE Cert_Dyn_SignedReader;<br \/>\nPRINT N&#039;  \u00b7 \u8bc1\u4e66\u6e05\u7406\u5b8c\u6210&#039;;<\/p>\n<p>\/* &#8212; \u6d4b\u8bd5\u8eab\u4efd&#xff08;\u6743\u9650\u6f14\u793a\u7528&#xff09;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nIF EXISTS (SELECT 1 FROM sys.database_principals WHERE name &#061; N&#039;u_Dyn_TestUser&#039;)<br \/>\n    DROP USER u_Dyn_TestUser;<br \/>\nIF EXISTS (SELECT 1 FROM sys.database_principals WHERE name &#061; N&#039;u_Dyn_CertReader&#039;)<br \/>\n    DROP USER u_Dyn_CertReader;<br \/>\nPRINT N&#039;  \u00b7 \u6d4b\u8bd5\u8eab\u4efd\u6e05\u7406\u5b8c\u6210&#039;;<br \/>\nGO<\/p>\n<p>\/* &#8212; \u6570\u636e\u5e93\u4e3b\u5bc6\u94a5&#xff08;\u7b2c 06 \u8282\u7684\u6a21\u5757\u7b7e\u540d\u9700\u8981&#xff09;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; *\/<br \/>\nIF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name &#061; N&#039;##MS_DatabaseMasterKey##&#039;)<br \/>\nBEGIN<br \/>\n    CREATE MASTER KEY ENCRYPTION BY PASSWORD &#061; N&#039;Dyn&#064;Demo#2025!Key&#039;;<br \/>\n    PRINT N&#039;  \u00b7 \u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5df2\u521b\u5efa&#xff08;\u6a21\u5757\u7b7e\u540d\u6240\u9700&#xff09;&#039;;<br \/>\nEND<br \/>\nELSE<br \/>\n    PRINT N&#039;  \u00b7 \u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5df2\u5b58\u5728&#xff08;\u8df3\u8fc7&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301000-C\u3011\u5efa\u7acb\u672c\u8282\u7684\u6f14\u793a\u8f85\u52a9\u8868\u4e0e\u7d22\u5f15<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u00b7 Dyn_AllowedTable \/ Dyn_AllowedColumn \u2014\u2014 \u767d\u540d\u5355\u5143\u6570\u636e\u8868&#xff08;\u6838\u5fc3\u5b89\u5168\u673a\u5236&#xff09;<br \/>\n   \u00b7 Dyn_SearchLog                        \u2014\u2014 \u8bb0\u5f55\u6bcf\u6b21\u52a8\u6001\u67e5\u8be2\u7684\u6784\u9020\u8fc7\u7a0b<br \/>\n   \u00b7 Dyn_InjectionDemo                    \u2014\u2014 \u6ce8\u5165\u6f14\u793a\u9776\u573a&#xff08;\u9694\u79bb\u7684\u5047\u8868&#xff09;<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;\u301000-C\u3011\u5efa\u7acb\u6f14\u793a\u8f85\u52a9\u5bf9\u8c61&#039;;<br \/>\nPRINT N&#039;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>\/* &#8212; \u767d\u540d\u5355&#xff1a;\u5141\u8bb8\u88ab\u52a8\u6001\u62fc\u63a5\u7684\u8868\u540d &#8212; *\/<br \/>\nCREATE TABLE dbo.Dyn_AllowedTable<br \/>\n(<br \/>\n    TableId     int          NOT NULL IDENTITY(1,1) PRIMARY KEY,<br \/>\n    SchemaName  sysname      NOT NULL,<br \/>\n    TableName   sysname      NOT NULL,<br \/>\n    DisplayName nvarchar(80) NOT NULL,<br \/>\n    IsEnabled   bit          NOT NULL CONSTRAINT DF_Dyn_AT_Enabled DEFAULT (1),<br \/>\n    CONSTRAINT UQ_Dyn_AT UNIQUE (SchemaName, TableName)<br \/>\n);<\/p>\n<p>INSERT INTO dbo.Dyn_AllowedTable (SchemaName, TableName, DisplayName) VALUES<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;,     N&#039;\u9500\u552e\u8ba2\u5355&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrderLine&#039;, N&#039;\u9500\u552e\u8ba2\u5355\u660e\u7ec6&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;Product&#039;,        N&#039;\u73e0\u5b9d\u5546\u54c1&#039;),<br \/>\n    (N&#039;crm&#039;, N&#039;Customer&#039;,       N&#039;\u5ba2\u6237&#039;),<br \/>\n    (N&#039;crm&#039;, N&#039;Interaction&#039;,    N&#039;\u5ba2\u6237\u4e92\u52a8&#039;),<br \/>\n    (N&#039;hr&#039;,  N&#039;Employee&#039;,       N&#039;\u5458\u5de5&#039;);<\/p>\n<p>\/* &#8212; \u767d\u540d\u5355&#xff1a;\u5141\u8bb8\u88ab\u52a8\u6001\u62fc\u63a5\u7684\u5217\u540d&#xff0c;\u6309&#034;\u4e1a\u52a1\u89c6\u89d2&#034;\u6620\u5c04 &#8212; *\/<br \/>\nCREATE TABLE dbo.Dyn_AllowedColumn<br \/>\n(<br \/>\n    ColumnId    int           NOT NULL IDENTITY(1,1) PRIMARY KEY,<br \/>\n    SchemaName  sysname       NOT NULL,<br \/>\n    TableName   sysname       NOT NULL,<br \/>\n    ColumnName  sysname       NOT NULL,<br \/>\n    DisplayName nvarchar(80)  NOT NULL,<br \/>\n    DataType    sysname       NOT NULL,<br \/>\n    Sortable    bit           NOT NULL CONSTRAINT DF_Dyn_AC_Sortable DEFAULT (0),<br \/>\n    IsEnabled   bit           NOT NULL CONSTRAINT DF_Dyn_AC_Enabled  DEFAULT (1),<br \/>\n    CONSTRAINT UQ_Dyn_AC UNIQUE (SchemaName, TableName, ColumnName)<br \/>\n);<\/p>\n<p>INSERT INTO dbo.Dyn_AllowedColumn (SchemaName, TableName, ColumnName, DisplayName, DataType, Sortable) VALUES<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;OrderNo&#039;,        N&#039;\u8ba2\u5355\u53f7&#039;,     N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;OrderDate&#039;,      N&#039;\u8ba2\u5355\u65e5\u671f&#039;,   N&#039;datetime2&#039;,1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;CountryCode&#039;,    N&#039;\u56fd\u5bb6\/\u5730\u533a&#039;,  N&#039;char&#039;,     1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;StoreCode&#039;,      N&#039;\u95e8\u5e97\u7f16\u7801&#039;,   N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;NetAmountUsd&#039;,   N&#039;\u51c0\u989d(USD)&#039;,  N&#039;decimal&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;Status&#039;,         N&#039;\u8ba2\u5355\u72b6\u6001&#039;,   N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrderLine&#039;, N&#039;Quantity&#039;,   N&#039;\u6570\u91cf&#039;,       N&#039;int&#039;,      1),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrderLine&#039;, N&#039;LineAmount&#039;, N&#039;\u884c\u91d1\u989d&#039;,     N&#039;decimal&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;Product&#039;,    N&#039;Sku&#039;,            N&#039;\u5546\u54c1\u7f16\u7801&#039;,   N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;erp&#039;, N&#039;Product&#039;,    N&#039;ProductName&#039;,    N&#039;\u5546\u54c1\u540d\u79f0&#039;,   N&#039;nvarchar&#039;, 1),<br \/>\n    (N&#039;erp&#039;, N&#039;Product&#039;,    N&#039;Category&#039;,       N&#039;\u54c1\u7c7b&#039;,       N&#039;nvarchar&#039;, 1),<br \/>\n    (N&#039;erp&#039;, N&#039;Product&#039;,    N&#039;UnitPrice&#039;,      N&#039;\u5355\u4ef7&#039;,       N&#039;decimal&#039;,  1),<br \/>\n    (N&#039;crm&#039;, N&#039;Customer&#039;,   N&#039;CustomerNo&#039;,     N&#039;\u5ba2\u6237\u7f16\u53f7&#039;,   N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;crm&#039;, N&#039;Customer&#039;,   N&#039;CustomerName&#039;,   N&#039;\u5ba2\u6237\u540d\u79f0&#039;,   N&#039;nvarchar&#039;, 1),<br \/>\n    (N&#039;crm&#039;, N&#039;Customer&#039;,   N&#039;Tier&#039;,           N&#039;\u5ba2\u6237\u7b49\u7ea7&#039;,   N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;crm&#039;, N&#039;Customer&#039;,   N&#039;RegisterDate&#039;,   N&#039;\u6ce8\u518c\u65e5\u671f&#039;,   N&#039;date&#039;,     1),<br \/>\n    (N&#039;hr&#039;,  N&#039;Employee&#039;,   N&#039;EmployeeNo&#039;,     N&#039;\u5de5\u53f7&#039;,       N&#039;varchar&#039;,  1),<br \/>\n    (N&#039;hr&#039;,  N&#039;Employee&#039;,   N&#039;FullName&#039;,       N&#039;\u59d3\u540d&#039;,       N&#039;nvarchar&#039;, 1),<br \/>\n    (N&#039;hr&#039;,  N&#039;Employee&#039;,   N&#039;Department&#039;,     N&#039;\u90e8\u95e8&#039;,       N&#039;nvarchar&#039;, 1),<br \/>\n    (N&#039;hr&#039;,  N&#039;Employee&#039;,   N&#039;HireDate&#039;,       N&#039;\u5165\u804c\u65e5\u671f&#039;,   N&#039;date&#039;,     1);<\/p>\n<p>\/* &#8212; \u52a8\u6001\u67e5\u8be2\u5ba1\u8ba1\u8868 &#8212; *\/<br \/>\nCREATE TABLE dbo.Dyn_SearchLog<br \/>\n(<br \/>\n    LogId        bigint        NOT NULL IDENTITY(1,1) PRIMARY KEY,<br \/>\n    LoggedAt     datetime2(3)  NOT NULL CONSTRAINT DF_Dyn_SL_At    DEFAULT (SYSDATETIME()),<br \/>\n    CallerSid    varbinary(85) NOT NULL CONSTRAINT DF_Dyn_SL_Sid   DEFAULT (SUSER_SID()),<br \/>\n    ProcName     sysname       NULL,<br \/>\n    FilterJson   nvarchar(1000) NULL,<br \/>\n    SqlPreview   nvarchar(1000) NULL,<br \/>\n    ParamCount   int           NOT NULL CONSTRAINT DF_Dyn_SL_PC   DEFAULT (0),<br \/>\n    ElapsedUs    bigint        NULL,<br \/>\n    \/* \u2605 \u6ce8\u610f&#xff1a;RowCount \u5728 SQL Server 2025 \u91cc\u662f\u3010\u4fdd\u7559\u5173\u952e\u5b57\u3011&#xff08;156&#xff09;&#xff0c;<br \/>\n       \u4f5c\u4e3a\u88f8\u5217\u540d\u4f1a\u62a5\u300c\u5173\u952e\u5b57 &#039;RowCount&#039; \u9644\u8fd1\u6709\u8bed\u6cd5\u9519\u8bef\u300d&#xff0c;\u5fc5\u987b\u52a0 []\u3002 *\/<br \/>\n    [RowCount]   bigint        NULL,<br \/>\n    Strategy     varchar(20)   NOT NULL CONSTRAINT DF_Dyn_SL_St   DEFAULT (&#039;dynamic&#039;)<br \/>\n);<br \/>\nCREATE INDEX IX_Dyn_SearchLog_At ON dbo.Dyn_SearchLog (LoggedAt DESC);<\/p>\n<p>\/* &#8212; \u6ce8\u5165\u6f14\u793a\u9776\u573a&#xff08;\u523b\u610f\u9694\u79bb\u7684\u5047\u8868&#xff0c;\u7edd\u4e0d\u53ef\u6307\u5411\u771f\u5b9e\u4e1a\u52a1\u8868&#xff09;&#8212; *\/<br \/>\nCREATE TABLE dbo.Dyn_InjectionDemo<br \/>\n(<br \/>\n    RowId    int           NOT NULL IDENTITY(1,1) PRIMARY KEY,<br \/>\n    Sku      varchar(20)   NOT NULL,<br \/>\n    ItemName nvarchar(80)  NOT NULL,<br \/>\n    Price    decimal(18,2) NOT NULL,<br \/>\n    IsSecret bit           NOT NULL CONSTRAINT DF_Dyn_ID_Secret DEFAULT (0)<br \/>\n);<br \/>\nINSERT INTO dbo.Dyn_InjectionDemo (Sku, ItemName, Price, IsSecret) VALUES<br \/>\n    (N&#039;SKU-0001&#039;, N&#039;\u8db3\u91d1\u9879\u94fe 18K&#039;,    12800.00, 0),<br \/>\n    (N&#039;SKU-0002&#039;, N&#039;\u94bb\u77f3\u6212\u6307 0.5ct&#039;,  45600.00, 0),<br \/>\n    (N&#039;SKU-0003&#039;, N&#039;\u7fe1\u7fe0\u624b\u956f A\u8d27&#039;,    98000.00, 0),<br \/>\n    (N&#039;SKU-0004&#039;, N&#039;\u5185\u90e8\u6210\u672c\u6838\u4ef7\u5355&#039;,   3200.00, 1);<\/p>\n<p>\/* &#8212; \u7ed3\u679c\u6821\u9a8c\u8868&#xff08;\u4f9b\u81ea\u9a8c\u8bc1\u8282\u5199\u5165\/\u6821\u9a8c&#xff09;&#8212; *\/<br \/>\nCREATE TABLE dbo.Dyn_ResultCheck<br \/>\n(<br \/>\n    CheckKey   varchar(40)  NOT NULL PRIMARY KEY,<br \/>\n    CheckValue nvarchar(200) NOT NULL,<br \/>\n    CheckedAt  datetime2(3) NOT NULL CONSTRAINT DF_Dyn_RC_At DEFAULT (SYSDATETIME())<br \/>\n);<\/p>\n<p>SELECT \u5bf9\u8c61 &#061; N&#039;dbo.Dyn_AllowedTable&#039;,  \u884c\u6570 &#061; COUNT(*) FROM dbo.Dyn_AllowedTable<br \/>\nUNION ALL SELECT N&#039;dbo.Dyn_AllowedColumn&#039;, COUNT(*) FROM dbo.Dyn_AllowedColumn<br \/>\nUNION ALL SELECT N&#039;dbo.Dyn_InjectionDemo&#039;, COUNT(*) FROM dbo.Dyn_InjectionDemo<br \/>\nUNION ALL SELECT N&#039;dbo.Dyn_SearchLog&#039;,     COUNT(*) FROM dbo.Dyn_SearchLog<br \/>\nUNION ALL SELECT N&#039;dbo.Dyn_ResultCheck&#039;,   COUNT(*) FROM dbo.Dyn_ResultCheck;<br \/>\nPRINT N&#039;  \u00b7 \u8f85\u52a9\u5bf9\u8c61\u5efa\u7acb\u5b8c\u6210&#xff08;\u767d\u540d\u5355 6 \u8868 \/ 20 \u5217&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301001\u3011\u52a8\u6001 SQL \u7684\u4e24\u79cd\u5f62\u6001 &amp; SQL \u6ce8\u5165\u7684\u89e3\u5256<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   1.1  EXEC() \u4e0e sp_executesql \u7684\u672c\u8d28\u533a\u522b<br \/>\n        \u8fd9\u662f\u7406\u89e3\u4e00\u5207\u5b89\u5168\u95ee\u9898\u7684\u57fa\u7840\u3002<\/p>\n<p>        EXEC(&#064;sql)                     sp_executesql N&#039;&#8230;&#039;, N&#039;&#064;p&#039;, &#064;v<br \/>\n        \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500      \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500<br \/>\n        \u53c2\u6570\u53ea\u80fd\u9760\u5b57\u7b26\u4e32\u62fc\u63a5            \u53c2\u6570\u8d70\u72ec\u7acb\u7684\u53c2\u6570\u901a\u9053<br \/>\n        \u503c\u8fdb\u5165\u89e3\u6790\u5668 &#061; \u53ef\u88ab\u5f53\u4ee3\u7801\u6267\u884c   \u503c\u6c38\u8fdc\u662f\u503c&#xff0c;\u4e0d\u8fdb\u5165\u89e3\u6790\u5668<br \/>\n        \u6bcf\u6b21\u62fc\u63a5\u90fd\u662f\u65b0\u8bed\u53e5 \u2192 \u7f13\u5b58\u7206\u70b8   \u540c\u7ed3\u6784\u8bed\u53e5\u590d\u7528\u540c\u4e00\u8ba1\u5212<br \/>\n        \u4e0d\u505a\u7c7b\u578b\u68c0\u67e5                    \u53c2\u6570\u6709\u660e\u786e\u7c7b\u578b&#xff0c;\u53ef\u505a\u7c7b\u578b\u68c0\u67e5<br \/>\n        \u2605 \u552f\u4e00\u4f18\u52bf&#xff1a;SQL \u6587\u672c\u957f\u5ea6\u65e0\u9650\u5236  \u2605 \u652f\u6301\u4efb\u610f SQL \u7247\u6bb5&#xff08;\u542b DDL&#xff09;<\/p>\n<p>   1.2  \u4e3a\u4ec0\u4e48\u53c2\u6570\u5316\u80fd\u6321\u4f4f\u6ce8\u5165&#xff1f;<br \/>\n        \u56e0\u4e3a SQL \u7684\u751f\u547d\u5468\u671f\u5206\u3010\u89e3\u6790\/\u7f16\u8bd1\u3011\u548c\u3010\u6267\u884c\u3011\u4e24\u4e2a\u9636\u6bb5\u3002<br \/>\n        \u53c2\u6570\u5316\u628a&#034;\u503c&#034;\u63a8\u8fdf\u5230\u6267\u884c\u9636\u6bb5\u624d\u7ed1\u5b9a&#xff0c;\u7f16\u8bd1\u9636\u6bb5\u6839\u672c\u770b\u4e0d\u5230\u5b83&#xff0c;<br \/>\n        \u6240\u4ee5\u6ce8\u5165\u7684\u5185\u5bb9\u6c38\u8fdc\u53ea\u662f\u6570\u636e&#xff0c;\u4e0d\u53ef\u80fd\u53d8\u6210\u8bed\u6cd5\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301001\u3011\u52a8\u6001 SQL \u7684\u4e24\u79cd\u5f62\u6001&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   1.1  \u6700\u57fa\u7840\u7684\u52a8\u6001\u67e5\u8be2&#xff1a;EXEC \u62fc\u63a5&#xff08;\u4ec5\u4f5c\u5bf9\u6bd4&#xff0c;\u4e0d\u63a8\u8350&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 1.1  EXEC \u62fc\u63a5\u5f0f&#xff08;\u53ef\u8bfb&#xff0c;\u4f46\u4e0d\u5b89\u5168&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;country char(2) &#061; N&#039;HK&#039;;<br \/>\nDECLARE &#064;minAmt  decimal(18,2) &#061; 5000.00;<\/p>\n<p>DECLARE &#064;sqlEx nvarchar(4000) &#061;<br \/>\n    N&#039;SELECT TOP 5 OrderNo, OrderDate, CountryCode, NetAmountUsd &#039;<br \/>\n  &#043; N&#039;FROM erp.SalesOrder &#039;<br \/>\n  &#043; N&#039;WHERE CountryCode &#061; &#039;&#039;&#039; &#043; &#064;country &#043; N&#039;&#039;&#039; &#039;<br \/>\n  &#043; N&#039;  AND NetAmountUsd &gt;&#061; &#039; &#043; CAST(&#064;minAmt AS nvarchar(20)) &#043; N&#039; &#039;<br \/>\n  &#043; N&#039;ORDER BY NetAmountUsd DESC;&#039;;<\/p>\n<p>PRINT N&#039;  \u62fc\u63a5\u51fa\u6765\u7684 SQL \u6587\u672c&#xff1a;&#039;;<br \/>\nPRINT N&#039;    &#039; &#043; &#064;sqlEx;<br \/>\nEXEC (&#064;sqlEx);<br \/>\nPRINT N&#039;  \u2605 \u6ce8\u610f\u4e24\u4e2a\u5751&#xff1a;\u5b57\u7b26\u4e32\u8981\u81ea\u5e26\u5f15\u53f7&#xff08;&#039;&#039;&#039;&#039;&#xff09;&#xff0c;\u6570\u5b57\u8981 CAST \u6210\u5b57\u7b26\u4e32\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u66f4\u81f4\u547d\u7684\u662f&#xff1a;&#064;country \u7684\u5185\u5bb9\u3010\u76f4\u63a5\u8fdb\u5165\u4e86 SQL \u8bed\u6cd5\u7ed3\u6784\u3011\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   1.2  \u540c\u6837\u7684\u67e5\u8be2&#xff0c;\u53c2\u6570\u5316\u5199\u6cd5<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 1.2  \u53c2\u6570\u5316\u5199\u6cd5&#xff08;\u63a8\u8350&#xff0c;\u4e14\u66f4\u7b80\u6d01&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;sqlPs nvarchar(4000) &#061;<br \/>\n    N&#039;SELECT TOP 5 OrderNo, OrderDate, CountryCode, NetAmountUsd &#039;<br \/>\n  &#043; N&#039;FROM erp.SalesOrder &#039;<br \/>\n  &#043; N&#039;WHERE CountryCode &#061; &#064;pCountry &#039;<br \/>\n  &#043; N&#039;  AND NetAmountUsd &gt;&#061; &#064;pMinAmt &#039;<br \/>\n  &#043; N&#039;ORDER BY NetAmountUsd DESC;&#039;;<\/p>\n<p>PRINT N&#039;  \u53c2\u6570\u5316 SQL \u6587\u672c&#xff08;\u65e0\u4efb\u4f55\u62fc\u63a5\u75d5\u8ff9&#xff09;&#xff1a;&#039;;<br \/>\nPRINT N&#039;    &#039; &#043; &#064;sqlPs;<br \/>\nEXEC sys.sp_executesql<br \/>\n     &#064;sqlPs,<br \/>\n     N&#039;&#064;pCountry char(2), &#064;pMinAmt decimal(18,2)&#039;,<br \/>\n     &#064;pCountry &#061; &#064;country,<br \/>\n     &#064;pMinAmt  &#061; &#064;minAmt;<br \/>\nPRINT N&#039;  \u2605 SQL \u6587\u672c\u662f\u3010\u7f16\u8bd1\u671f\u5e38\u91cf\u3011&#xff0c;\u503c\u5728\u8fd0\u884c\u671f\u624d\u7ed1\u5b9a \u2014\u2014 \u6ce8\u5165\u65e0\u95e8\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u4e14\u8bed\u53e5\u6587\u672c\u56fa\u5b9a \u2192 \u8ba1\u5212\u53ef\u590d\u7528&#xff08;\u8be6\u89c1\u7b2c 09 \u8282&#xff09;\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   1.3  \u2605 \u6ce8\u5165\u89e3\u5256&#xff08;\u9694\u79bb\u9776\u573a&#xff09;&#xff1a;\u8ba9\u653b\u51fb\u771f\u5b9e\u53d1\u751f\u4e00\u6b21&#xff0c;\u624d\u61c2\u600e\u4e48\u9632<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u9776\u573a\u8868 dbo.Dyn_InjectionDemo \u53ea\u6709 4 \u884c&#xff0c;\u662f\u3010\u523b\u610f\u9694\u79bb\u3011\u7684\u5047\u6570\u636e\u3002<br \/>\n   \u6240\u6709\u6f14\u793a\u5747\u5728\u9776\u573a\u5185\u8fdb\u884c&#xff0c;\u7edd\u4e0d\u89e6\u53ca\u771f\u5b9e\u4e1a\u52a1\u8868\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 1.3  SQL \u6ce8\u5165\u89e3\u5256&#xff08;\u9694\u79bb\u9776\u573a dbo.Dyn_InjectionDemo&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u9776\u573a\u6570\u636e&#xff1a;&#039;;<br \/>\nSELECT RowId, Sku, ItemName, Price, IsSecret FROM dbo.Dyn_InjectionDemo ORDER BY RowId;<\/p>\n<p>\/* &#8212; \u653b\u51fb 1&#xff1a;\u7ecf\u5178 OR 1&#061;1 \u7ed5\u8fc7\u6761\u4ef6 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u653b\u51fb 1&#xff1a;OR 1&#061;1 \u2014\u2014 \u7ed5\u8fc7 WHERE \u6761\u4ef6&#xff0c;\u62d6\u8d70\u5168\u8868&#039;;<br \/>\nDECLARE &#064;userInput1 nvarchar(100) &#061; N&#039;SKU-0001&#039;&#039; OR &#039;&#039;1&#039;&#039;&#061;&#039;&#039;1&#039;;<br \/>\nDECLARE &#064;badSql1 nvarchar(1000) &#061;<br \/>\n    N&#039;SELECT RowId, Sku, ItemName, Price FROM dbo.Dyn_InjectionDemo WHERE Sku &#061; &#039;&#039;&#039;<br \/>\n  &#043; &#064;userInput1 &#043; N&#039;&#039;&#039;;&#039;;<br \/>\nPRINT N&#039;    \u6076\u610f\u8f93\u5165 &#061; &#039; &#043; &#064;userInput1;<br \/>\nPRINT N&#039;    \u751f\u6210 SQL &#061; &#039; &#043; &#064;badSql1;<br \/>\nEXEC (&#064;badSql1);<br \/>\nPRINT N&#039;    \u2605 \u653b\u51fb\u8005\u6ca1\u731c\u5bc6\u7801\u3001\u6ca1\u6539\u6743\u9650&#xff0c;\u53ea\u662f\u8ba9 WHERE \u6052\u771f \u2014\u2014 \u6761\u4ef6\u88ab&#034;\u903b\u8f91\u77ed\u8def&#034;\u4e86\u3002&#039;;<\/p>\n<p>\/* &#8212; \u653b\u51fb 2&#xff1a;UNION \u6ce8\u5165&#xff0c;\u7a83\u53d6\u672c\u4e0d\u8be5\u770b\u7684\u5217 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u653b\u51fb 2&#xff1a;UNION SELECT \u2014\u2014 \u628a\u9690\u85cf\u5217 IsSecret \u62fc\u8fdb\u7ed3\u679c\u96c6&#039;;<br \/>\n\/* \u6076\u610f\u8f93\u5165\u4ee5 SKU \u6536\u5c3e&#xff0c;\u5e76\u7528 &#8212; \u5403\u6389\u62fc\u63a5\u8fdb\u6765\u7684\u90a3\u4e2a\u6536\u5c3e\u5355\u5f15\u53f7 *\/<br \/>\nDECLARE &#064;userInput2 nvarchar(200) &#061;<br \/>\n    N&#039;x&#039;&#039; UNION ALL SELECT RowId, Sku, ItemName, CAST(IsSecret AS decimal(18,2)) &#039;<br \/>\n  &#043; N&#039;FROM dbo.Dyn_InjectionDemo WHERE IsSecret &#061; 1 &#8211;&#039;;<br \/>\nDECLARE &#064;badSql2 nvarchar(2000) &#061;<br \/>\n    N&#039;SELECT RowId, Sku, ItemName, Price FROM dbo.Dyn_InjectionDemo WHERE Sku &#061; &#039;&#039;&#039;<br \/>\n  &#043; &#064;userInput2 &#043; N&#039;&#039;&#039;;&#039;;<br \/>\nPRINT N&#039;    \u751f\u6210 SQL &#061; &#039; &#043; &#064;badSql2;<br \/>\nEXEC (&#064;badSql2);<br \/>\nPRINT N&#039;    \u2605 \u6ce8\u610f\u7ed3\u5c3e\u7684 &#8212; &#xff0c;\u5b83\u6ce8\u91ca\u6389\u539f SQL \u5269\u4e0b\u7684\u5f15\u53f7&#xff0c;\u8ba9\u62fc\u63a5&#034;\u5408\u62e2&#034;\u3002&#039;;<br \/>\nPRINT N&#039;    \u2605 UNION \u8981\u6c42\u5217\u6570\u4e0e\u7c7b\u578b\u5339\u914d&#xff0c;\u653b\u51fb\u8005\u7528 CAST \u628a bit \u8f6c\u6210 decimal \u5bf9\u9f50\u3002&#039;;<\/p>\n<p>\/* &#8212; \u653b\u51fb 3&#xff1a;\u5806\u53e0\u6ce8\u5165&#xff08;\u591a\u8bed\u53e5&#xff09;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u653b\u51fb 3&#xff1a;\u5806\u53e0\u6ce8\u5165 \u2014\u2014 \u7528\u5206\u53f7\u8ffd\u52a0\u7b2c\u4e8c\u6761\u8bed\u53e5&#039;;<br \/>\nDECLARE &#064;userInput3 nvarchar(100) &#061; N&#039;SKU-0001&#039;&#039;; SELECT &#039;&#039;\u5df2\u88ab\u5806\u53e0\u6ce8\u5165&#039;&#039; AS \u8b66\u544a; &#8211;&#039;;<br \/>\nDECLARE &#064;badSql3 nvarchar(2000) &#061;<br \/>\n    N&#039;SELECT RowId, Sku FROM dbo.Dyn_InjectionDemo WHERE Sku &#061; &#039;&#039;&#039;<br \/>\n  &#043; &#064;userInput3 &#043; N&#039;&#039;&#039;;&#039;;<br \/>\nPRINT N&#039;    \u751f\u6210 SQL &#061; &#039; &#043; &#064;badSql3;<br \/>\nEXEC (&#064;badSql3);<br \/>\nPRINT N&#039;    \u2605 EXEC \/ sp_executesql \u90fd\u5141\u8bb8\u6279\u5185\u591a\u8bed\u53e5 \u2014\u2014 \u4f46\u53c2\u6570\u5316\u540e\u8fd9\u62db\u5f7b\u5e95\u5931\u6548\u3002&#039;;<\/p>\n<p>\/* &#8212; 1.4 \u540c\u4e00\u6279\u6076\u610f\u8f93\u5165&#xff0c;\u53c2\u6570\u5316\u540e\u662f\u4ec0\u4e48\u7ed3\u679c&#xff1f;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 1.4  \u540c\u6837\u7684\u6076\u610f\u8f93\u5165&#xff0c;\u53c2\u6570\u5316\u540e \u2192 \u53d8\u6210\u65e0\u5bb3\u7684&#034;\u5b57\u7b26\u4e32\u5b57\u9762\u91cf&#034;\u2500\u2500\u2500&#039;;<br \/>\nDECLARE &#064;sameInput nvarchar(100) &#061; N&#039;SKU-0001&#039;&#039; OR &#039;&#039;1&#039;&#039;&#061;&#039;&#039;1&#039;;<br \/>\nPRINT N&#039;    \u8f93\u5165\u4ecd\u662f&#xff1a;&#039; &#043; &#064;sameInput;<br \/>\nDECLARE &#064;result nvarchar(200);<br \/>\nSET &#064;result &#061;<br \/>\n    (SELECT TOP 1 Sku FROM dbo.Dyn_InjectionDemo WHERE Sku &#061; &#064;sameInput);<br \/>\nPRINT N&#039;    \u53c2\u6570\u5316\u67e5\u8be2\u7ed3\u679c&#xff1a;&#039; &#043; ISNULL(&#064;result, N&#039;&#xff08;0 \u884c \u2014\u2014 \u6ca1\u6709 SKU \u53eb\u8fd9\u4e2a\u540d\u5b57&#xff09;&#039;);<br \/>\nIF &#064;result IS NULL<br \/>\n    PRINT N&#039;    \u2605 \u6210\u529f\u6321\u4f4f&#xff01;\u56e0\u4e3a &#064;sameInput \u88ab\u5f53\u6210\u4e00\u6574\u4e2a\u3010\u503c\u3011\u53bb\u6bd4\u8f83&#xff0c;&#039;;<br \/>\nELSE<br \/>\n    PRINT N&#039;    \u2605 \u610f\u5916\u5339\u914d&#xff0c;\u8bf7\u68c0\u67e5\u6570\u636e\u3002&#039;;<br \/>\nPRINT N&#039;      \u800c\u4e0d\u662f\u88ab\u62c6\u6210 &#034;SKU-0001 OR 1&#061;1&#034; \u4e24\u4e2a\u8bed\u4e49\u7247\u6bb5\u3002&#039;;<\/p>\n<p>\/* &#8212; 1.5 \u653b\u51fb\u9762\u5c0f\u7ed3 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 1.5  \u7ed3\u8bba&#xff1a;\u62fc\u63a5 vs \u53c2\u6570\u5316 \u7684\u5bf9\u7167 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u73af\u8282                     &#061; \u6b65\u9aa4,<br \/>\n    EXEC\u62fc\u63a5                 &#061; \u62fc\u63a5\u65b9\u5f0f,<br \/>\n    sp_executesql\u53c2\u6570\u5316      &#061; \u53c2\u6570\u5316\u65b9\u5f0f,<br \/>\n    \u6ce8\u5165\u80fd\u5426\u6210\u529f             &#061; \u7ed3\u679c<br \/>\nFROM (VALUES<br \/>\n    (N&#039;1. \u503c\u8fdb\u5165\u89e3\u6790\u5668&#039;,   N&#039;\u662f&#xff08;\u5f53\u4ee3\u7801\u89e3\u6790&#xff09;&#039;, N&#039;\u5426&#xff08;\u5f53\u6570\u636e\u5904\u7406&#xff09;&#039;, N&#039;\u62fc\u63a5&#061;\u5fc5\u4e2d \/ \u53c2\u6570\u5316&#061;\u514d\u75ab&#039;),<br \/>\n    (N&#039;2. OR 1&#061;1 \u7ed5\u8fc7&#039;,    N&#039;\u7ed5\u8fc7\u6210\u529f&#039;,        N&#039;\u89c6\u4e3a\u666e\u901a\u5b57\u7b26\u4e32&#039;,   N&#039;\u62fc\u63a5&#061;\u5371\u9669 \/ \u53c2\u6570\u5316&#061;\u5b89\u5168&#039;),<br \/>\n    (N&#039;3. UNION \u7a83\u5bc6&#039;,     N&#039;\u53ef\u7a83\u53d6\u4efb\u610f\u5217&#039;,    N&#039;\u89c6\u4e3a\u666e\u901a\u5b57\u7b26\u4e32&#039;,   N&#039;\u62fc\u63a5&#061;\u5371\u9669 \/ \u53c2\u6570\u5316&#061;\u5b89\u5168&#039;),<br \/>\n    (N&#039;4. \u5806\u53e0\u591a\u8bed\u53e5&#039;,     N&#039;\u53ef\u6267\u884c\u4efb\u610f\u8bed\u53e5&#039;,  N&#039;\u89c6\u4e3a\u666e\u901a\u5b57\u7b26\u4e32&#039;,   N&#039;\u62fc\u63a5&#061;\u5371\u9669 \/ \u53c2\u6570\u5316&#061;\u5b89\u5168&#039;),<br \/>\n    (N&#039;5. \u8ba1\u5212\u590d\u7528&#039;,       N&#039;\u6bcf\u6761\u65b0\u4e32&#061;\u65b0\u8ba1\u5212&#039;, N&#039;\u540c\u7ed3\u6784\u590d\u7528\u8ba1\u5212&#039;,   N&#039;\u53c2\u6570\u5316&#061;\u66f4\u7701\u5185\u5b58&#039;)<br \/>\n) v(\u6b65\u9aa4, \u62fc\u63a5\u65b9\u5f0f, \u53c2\u6570\u5316\u65b9\u5f0f, \u7ed3\u679c);<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301002\u3011\u56db\u79cd\u6267\u884c\u65b9\u5f0f\u5bf9\u7167 \u2014\u2014 EXEC \/ sp_executesql \/ \u9759\u6001SQL \/ \u5b58\u50a8\u8fc7\u7a0b<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u672c\u8282\u7528\u540c\u4e00\u4efd\u4e1a\u52a1\u9700\u6c42&#xff08;&#034;\u6309\u56fd\u5bb6\/\u5730\u533a &#043; \u91d1\u989d\u533a\u95f4\u67e5\u73e0\u5b9d\u8ba2\u5355&#034;&#xff09;\u5199\u51fa\u56db\u79cd\u5b9e\u73b0&#xff0c;<br \/>\n   \u7136\u540e\u4ece\u3010\u5b89\u5168\u6027 \/ \u8ba1\u5212\u590d\u7528 \/ \u7f13\u5b58\u5f00\u9500 \/ \u6743\u9650 \/ \u53ef\u7ef4\u62a4\u6027\u3011\u4e94\u4e2a\u7ef4\u5ea6\u6253\u5206\u3002<\/p>\n<p>   \u540c\u65f6\u63ed\u793a\u4e24\u4e2a\u5173\u952e\u4e8b\u5b9e&#xff1a;<br \/>\n     A. SELECT * FROM &#039; &#043; &#064;table  \u2192 \u5ef6\u8fdf\u540d\u79f0\u89e3\u6790&#xff0c;\u8fd0\u884c\u671f\u624d\u62a5\u9519&#xff08;\u5751 6&#xff09;<br \/>\n     B. \u52a8\u6001 SQL \u6c38\u8fdc\u4e0d\u4f1a\u88ab&#034;\u81ea\u52a8\u53c2\u6570\u5316&#034;&#xff0c;\u5373\u4f7f SQL Server 2025 \u7684\u5f00\u9500\u9608\u503c<br \/>\n        \u81ea\u52a8\u53c2\u6570\u5316\u4e5f\u7ba1\u4e0d\u5230 EXEC \u91cc\u7684\u5b57\u7b26\u4e32<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301002\u3011\u56db\u79cd\u6267\u884c\u65b9\u5f0f\u5bf9\u7167&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   2.1  \u65b9\u5f0f\u4e00&#xff1a;EXEC \u62fc\u63a5&#xff08;\u6700\u5dee\u5b9e\u8df5&#xff0c;\u4ec5\u4f5c\u53cd\u9762\u6559\u6750&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 2.1  \u65b9\u5f0f\u4e00&#xff1a;EXEC \u62fc\u63a5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;c1 char(2) &#061; N&#039;US&#039;;<br \/>\nDECLARE &#064;m1 decimal(18,2) &#061; 10000;<\/p>\n<p>DECLARE &#064;s1 nvarchar(4000) &#061;<br \/>\n    N&#039;SELECT COUNT(*) AS \u8ba2\u5355\u6570, CAST(SUM(NetAmountUsd) AS decimal(18,2)) AS \u5408\u8ba1USD &#039;<br \/>\n  &#043; N&#039;FROM erp.SalesOrder WHERE CountryCode &#061; &#039;&#039;&#039; &#043; &#064;c1 &#043; N&#039;&#039;&#039; AND NetAmountUsd &gt;&#061; &#039;<br \/>\n  &#043; CAST(&#064;m1 AS nvarchar(20)) &#043; N&#039;;&#039;;<br \/>\nEXEC (&#064;s1);<br \/>\nPRINT N&#039;  \u2717 \u503c\u76f4\u63a5\u8fdb\u89e3\u6790\u5668&#xff1a;&#064;c1 \u82e5\u542b\u5f15\u53f7\u5373\u53ef\u6ce8\u5165&#039;;<br \/>\nPRINT N&#039;  \u2717 &#039;&#039;US&#039;&#039; \u4e0e 10000 \u90fd\u6210\u4e86\u5b57\u9762\u91cf \u2192 \u6362\u4e2a\u6570\u5c31\u662f\u4e00\u6761\u5168\u65b0\u7684\u7f13\u5b58\u8bed\u53e5&#039;;<br \/>\nPRINT N&#039;  \u2717 \u65e0\u7c7b\u578b\u68c0\u67e5&#xff1a;\u5ba2\u6237\u7aef\u4f20\u4e2a\u4e71\u4e32\u4e5f\u5728\u8fd0\u884c\u671f\u624d\u70b8&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   2.2  \u65b9\u5f0f\u4e8c&#xff1a;sp_executesql \u53c2\u6570\u5316&#xff08;\u52a8\u6001 SQL \u7684\u6700\u4f73\u5b9e\u8df5&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 2.2  \u65b9\u5f0f\u4e8c&#xff1a;sp_executesql \u53c2\u6570\u5316 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;s2 nvarchar(4000) &#061;<br \/>\n    N&#039;SELECT COUNT(*) AS \u8ba2\u5355\u6570, CAST(SUM(NetAmountUsd) AS decimal(18,2)) AS \u5408\u8ba1USD &#039;<br \/>\n  &#043; N&#039;FROM erp.SalesOrder WHERE CountryCode &#061; &#064;c AND NetAmountUsd &gt;&#061; &#064;m;&#039;;<br \/>\nEXEC sys.sp_executesql &#064;s2, N&#039;&#064;c char(2), &#064;m decimal(18,2)&#039;, &#064;c &#061; &#064;c1, &#064;m &#061; &#064;m1;<br \/>\nPRINT N&#039;  \u2713 \u503c\u8d70\u53c2\u6570\u901a\u9053&#xff0c;\u6c38\u4e0d\u8fdb\u89e3\u6790\u5668&#039;;<br \/>\nPRINT N&#039;  \u2713 SQL \u6587\u672c\u56fa\u5b9a \u2192 \u4e0d\u540c\u53c2\u6570\u590d\u7528\u540c\u4e00\u8ba1\u5212&#039;;<br \/>\nPRINT N&#039;  \u2713 \u53c2\u6570\u6709\u660e\u786e\u7c7b\u578b&#xff0c;\u7f16\u8bd1\u671f\u5373\u53ef\u62a5\u7c7b\u578b\u9519\u8bef&#039;;<\/p>\n<p>\/* &#8212; \u8bc1\u660e\u8ba1\u5212\u590d\u7528&#xff1a;\u8fde\u7eed\u4e09\u6b21\u4e0d\u540c\u53c2\u6570&#xff0c;\u89c2\u5bdf\u7f13\u5b58\u4e2d\u7684\u8bed\u53e5\u6570 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u9a8c\u8bc1\u8ba1\u5212\u590d\u7528&#xff1a;\u540c\u4e00\u6bb5 SQL \u6587\u672c\u7528 3 \u7ec4\u4e0d\u540c\u53c2\u6570\u6267\u884c&#039;;<br \/>\nEXEC sys.sp_executesql &#064;s2, N&#039;&#064;c char(2), &#064;m decimal(18,2)&#039;, &#064;c &#061; N&#039;CN&#039;, &#064;m &#061; 20000;<br \/>\nEXEC sys.sp_executesql &#064;s2, N&#039;&#064;c char(2), &#064;m decimal(18,2)&#039;, &#064;c &#061; N&#039;JP&#039;, &#064;m &#061; 30000;<br \/>\nEXEC sys.sp_executesql &#064;s2, N&#039;&#064;c char(2), &#064;m decimal(18,2)&#039;, &#064;c &#061; N&#039;SG&#039;, &#064;m &#061; 15000;<\/p>\n<p>SELECT<br \/>\n    \u6307\u6807 &#061; N&#039;\u7f13\u5b58\u4e2d\u5339\u914d\u8be5 SQL \u6587\u672c\u7684\u6761\u76ee\u6570&#039;,<br \/>\n    \u503c   &#061; CAST(COUNT(*) AS nvarchar(10)),<br \/>\n    \u89e3\u8bfb &#061; CASE WHEN COUNT(*) &lt;&#061; 2 THEN N&#039;\u2713 \u591a\u7ec4\u53c2\u6570\u5171\u7528\u5c11\u91cf\u8ba1\u5212&#xff08;\u590d\u7528\u6210\u529f&#xff09;&#039;<br \/>\n                ELSE N&#039;\u26a0 \u6761\u76ee\u504f\u591a&#xff0c;\u68c0\u67e5\u662f\u5426\u6709\u5b57\u9762\u91cf\u62fc\u63a5&#039; END<br \/>\nFROM sys.dm_exec_cached_plans cp<br \/>\nCROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\nWHERE t.text LIKE N&#039;%FROM erp.SalesOrder WHERE CountryCode &#061; &#064;c%&#039;;<\/p>\n<p>\/* &#8212; \u5bf9\u6bd4&#xff1a;EXEC \u62fc\u63a5\u7684\u4e09\u79cd\u91d1\u989d \u2192 \u4e09\u6761\u72ec\u7acb\u8bed\u53e5 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u53cd\u8bc1&#xff1a;EXEC \u7528 3 \u7ec4\u4e0d\u540c\u91d1\u989d\u62fc\u63a5 \u2192 3 \u6761\u72ec\u7acb\u8bed\u53e5&#xff0c;3 \u4efd\u8ba1\u5212&#039;;<br \/>\nDECLARE &#064;vals TABLE (i int IDENTITY(1,1), v decimal(18,2));<br \/>\nINSERT INTO &#064;vals (v) VALUES (11000), (12000), (13000);<br \/>\nDECLARE &#064;i int &#061; 1, &#064;n int &#061; (SELECT COUNT(*) FROM &#064;vals);<br \/>\nWHILE &#064;i &lt;&#061; &#064;n<br \/>\nBEGIN<br \/>\n    DECLARE &#064;vv decimal(18,2) &#061; (SELECT v FROM &#064;vals WHERE i &#061; &#064;i);<br \/>\n    DECLARE &#064;sx nvarchar(2000) &#061;<br \/>\n        N&#039;SELECT COUNT(*) AS \u8ba2\u5355\u6570 FROM erp.SalesOrder WHERE CountryCode &#061; &#039;&#039;US&#039;&#039; AND NetAmountUsd &gt;&#061; &#039;<br \/>\n      &#043; CAST(&#064;vv AS nvarchar(20)) &#043; N&#039;;&#039;;<br \/>\n    EXEC (&#064;sx);<br \/>\n    SET &#064;i &#043;&#061; 1;<br \/>\nEND<br \/>\nSELECT<br \/>\n    \u6307\u6807 &#061; N&#039;EXEC \u62fc\u63a5\u4ea7\u751f\u7684\u7f13\u5b58\u6761\u76ee\u6570&#xff08;\u540c\u4e00\u6a21\u5f0f&#xff09;&#039;,<br \/>\n    \u503c   &#061; CAST(COUNT(*) AS nvarchar(10)),<br \/>\n    \u89e3\u8bfb &#061; CASE WHEN COUNT(*) &gt;&#061; 3 THEN N&#039;\u2717 \u6bcf\u4e2a\u4e0d\u540c\u5b57\u9762\u91cf &#061; \u4e00\u6761\u65b0\u8bed\u53e5&#xff08;\u7f13\u5b58\u81a8\u80c0&#xff09;&#039;<br \/>\n                ELSE N&#039;&#xff08;\u6837\u672c\u4e0d\u8db3&#xff0c;\u53ef\u80fd\u5df2\u88ab\u5185\u5b58\u538b\u529b\u6dd8\u6c70&#xff09;&#039; END<br \/>\nFROM sys.dm_exec_cached_plans cp<br \/>\nCROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\nWHERE t.text LIKE N&#039;%FROM erp.SalesOrder WHERE CountryCode &#061; &#039;&#039;US&#039;&#039; AND NetAmountUsd &gt;&#061;%&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   2.3  \u65b9\u5f0f\u4e09&#xff1a;\u9759\u6001 SQL&#xff08;\u65e0\u6761\u4ef6\u65f6\u7684\u6700\u4f18\u89e3&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 2.3  \u65b9\u5f0f\u4e09&#xff1a;\u9759\u6001 SQL&#xff08;\u80fd\u7528\u5c31\u7528&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT COUNT(*) AS \u8ba2\u5355\u6570, CAST(SUM(NetAmountUsd) AS decimal(18,2)) AS \u5408\u8ba1USD<br \/>\nFROM erp.SalesOrder WHERE CountryCode &#061; &#039;US&#039; AND NetAmountUsd &gt;&#061; 10000;<br \/>\nPRINT N&#039;  \u2713 \u7f16\u8bd1\u671f\u5b8c\u5168\u53ef\u89c1 \u2192 \u4f18\u5316\u5668\u53ef\u505a\u6700\u597d\u4f30\u8ba1&#039;;<br \/>\nPRINT N&#039;  \u2713 \u81ea\u52a8\u53c2\u6570\u5316&#xff08;simple\/forced&#xff09;\u6709\u673a\u4f1a\u547d\u4e2d&#039;;<br \/>\nPRINT N&#039;  \u2713 \u65e0\u6ce8\u5165\u9762&#xff0c;\u96f6\u7ef4\u62a4\u6210\u672c&#039;;<br \/>\nPRINT N&#039;  \u2717 \u7f3a\u70b9&#xff1a;\u6761\u4ef6\u7ec4\u5408\u662f\u6709\u9650\u7684&#xff0c;\u65e0\u6cd5\u5e94\u5bf9&#034;\u4efb\u610f\u7ec4\u5408\u52a8\u6001\u7b5b\u9009&#034;&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   2.4  \u65b9\u5f0f\u56db&#xff1a;\u5b58\u50a8\u8fc7\u7a0b&#xff08;\u5b89\u5168\u4e0e\u8ba1\u5212\u7684\u6700\u7ec8\u7b54\u6848&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 2.4  \u65b9\u5f0f\u56db&#xff1a;\u5b58\u50a8\u8fc7\u7a0b \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u521b\u5efa\u4e00\u4e2a\u53c2\u6570\u5316\u7684\u5b58\u50a8\u8fc7\u7a0b&#xff0c;\u5185\u90e8\u4ecd\u7528 sp_executesql&#xff1b;&#039;;<br \/>\nPRINT N&#039;  \u4f46 SQL \u6587\u672c\u5b8c\u5168\u7531\u3010\u4ee3\u7801\u5185\u5e38\u91cf\u3011\u62fc\u6210&#xff0c;\u4e0d\u63a5\u53d7\u4efb\u4f55\u5916\u90e8\u7247\u6bb5\u3002&#039;;<\/p>\n<p>EXEC(N&#039;<br \/>\nCREATE PROCEDURE dbo.usp_Dyn_SearchOrders_Static<br \/>\n    &#064;CountryCode char(2)       &#061; NULL,<br \/>\n    &#064;MinAmount   decimal(18,2) &#061; NULL,<br \/>\n    &#064;TopN        int           &#061; 10<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<\/p>\n<p>    \/* \u9759\u6001 SQL &#043; \u53ef\u9009\u53c2\u6570\u6a21\u5f0f&#xff1a;\u8ba1\u5212\u7a33\u5b9a&#xff0c;\u4f46\u7d22\u5f15\u53ef\u80fd\u7528\u4e0d\u6ee1 *\/<br \/>\n    SELECT TOP (&#064;TopN)<br \/>\n           OrderNo, OrderDate, CountryCode, StoreCode,<br \/>\n           NetAmountUsd, Status<br \/>\n    FROM   erp.SalesOrder<br \/>\n    WHERE  (&#064;CountryCode IS NULL OR CountryCode &#061; &#064;CountryCode)<br \/>\n    AND    (&#064;MinAmount   IS NULL OR NetAmountUsd &gt;&#061; &#064;MinAmount)<br \/>\n    ORDER BY NetAmountUsd DESC;<br \/>\nEND<br \/>\n&#039;);<br \/>\nPRINT N&#039;  \u00b7 dbo.usp_Dyn_SearchOrders_Static \u521b\u5efa\u5b8c\u6210&#039;;<br \/>\nGO<\/p>\n<p>PRINT N&#039;  \u25b8 \u8c03\u7528&#xff08;\u53ea\u4f20\u56fd\u5bb6\/\u5730\u533a&#xff09;&#xff1a;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Static &#064;CountryCode &#061; N&#039;HK&#039;, &#064;TopN &#061; 5;<br \/>\nPRINT N&#039;  \u25b8 \u8c03\u7528&#xff08;\u4e24\u4e2a\u6761\u4ef6\u90fd\u4f20&#xff09;&#xff1a;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Static &#064;CountryCode &#061; N&#039;JP&#039;, &#064;MinAmount &#061; 20000, &#064;TopN &#061; 5;<br \/>\nPRINT N&#039;  \u25b8 \u8c03\u7528&#xff08;\u90fd\u4e0d\u4f20 \u2192 \u53d6\u5168\u91cf Top 5&#xff09;&#xff1a;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Static &#064;TopN &#061; 5;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   2.5  \u4e94\u7ef4\u6253\u5206\u603b\u8868<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 2.5  \u4e94\u79cd\u65b9\u5f0f\u5bf9\u7167\u603b\u8868 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u65b9\u5f0f         &#061; \u65b9\u5f0f,<br \/>\n    \u5b89\u5168\u6027       &#061; \u5b89\u5168,<br \/>\n    \u8ba1\u5212\u590d\u7528     &#061; \u590d\u7528,<br \/>\n    \u6ce8\u5165\u9762       &#061; \u6ce8\u5165\u9762,<br \/>\n    \u9002\u7528\u573a\u666f     &#061; \u573a\u666f<br \/>\nFROM (VALUES<br \/>\n    (N&#039;EXEC \u62fc\u63a5&#039;,        N&#039;\u2717 \u4f4e&#xff08;\u503c\u8fdb\u89e3\u6790\u5668&#xff09;&#039;, N&#039;\u2717 \u5dee&#xff08;\u6bcf\u6761\u65b0\u4e32&#xff09;&#039;, N&#039;\u5927&#039;, N&#039;\u4ec5\u9650\u5185\u90e8\u5e38\u91cf&#xff0c;\u7edd\u4e0d\u63a5\u5916\u90e8\u8f93\u5165&#039;),<br \/>\n    (N&#039;sp_executesql&#039;,    N&#039;\u2713 \u9ad8&#xff08;\u53c2\u6570\u5316&#xff09;&#039;,     N&#039;\u2713 \u597d&#xff08;\u540c\u6587\u672c\u590d\u7528&#xff09;&#039;, N&#039;\u5c0f&#039;, N&#039;\u52a8\u6001 SQL \u9996\u9009&#xff1a;\u62fc\u7ed3\u6784\u3001\u4f20\u53c2\u6570&#039;),<br \/>\n    (N&#039;\u9759\u6001 SQL&#039;,         N&#039;\u2713 \u6700\u9ad8&#039;,             N&#039;\u2713 \u597d&#xff08;\u81ea\u52a8\u53c2\u6570\u5316&#xff09;&#039;, N&#039;\u65e0&#039;, N&#039;\u6761\u4ef6\u56fa\u5b9a\u65f6\u6700\u4f18&#039;),<br \/>\n    (N&#039;\u5b58\u50a8\u8fc7\u7a0b&#039;,         N&#039;\u2713 \u9ad8&#xff08;\u53ef\u7b7e\u540d&#xff09;&#039;,     N&#039;\u2713 \u597d &#043; \u53ef\u5f3a\u5236\u8ba1\u5212&#039;, N&#039;\u5c0f&#039;, N&#039;\u751f\u4ea7\u6838\u5fc3&#xff1a;\u6743\u9650\u6536\u655b &#043; \u8ba1\u5212\u7a33\u5b9a&#039;),<br \/>\n    (N&#039;\u89c6\u56fe\/\u51fd\u6570&#039;,        N&#039;\u2713 \u9ad8&#039;,               N&#039;\u2713 \u597d&#039;,             N&#039;\u65e0&#039;, N&#039;\u56fa\u5b9a\u53e3\u5f84\u590d\u7528&#xff0c;\u6ce8\u610f\u53c2\u6570\u5316\u9677\u9631&#039;)<br \/>\n) v(\u65b9\u5f0f, \u5b89\u5168, \u590d\u7528, \u6ce8\u5165\u9762, \u573a\u666f);<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301002-B\u3011\u52a8\u6001 SQL \u4e0e&#034;\u81ea\u52a8\u53c2\u6570\u5316&#034;\u7684\u8fb9\u754c&#xff08;\u4e00\u4e2a\u5e38\u88ab\u8bef\u89e3\u7684\u70b9&#xff09;<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   SQL Server \u6709\u3010\u7b80\u5355\u53c2\u6570\u5316\u3011\u548c\u3010\u5f3a\u5236\u53c2\u6570\u5316\u3011\u4e24\u79cd\u81ea\u52a8\u53c2\u6570\u5316\u673a\u5236&#xff0c;<br \/>\n   \u4f46\u5b83\u4eec\u53ea\u4f5c\u7528\u4e8e\u3010\u76f4\u63a5\u63d0\u4ea4\u7684\u9759\u6001 SQL \u6279\u3011\u3002<br \/>\n   \u5305\u5728 EXEC() \/ sp_executesql \u5b57\u7b26\u4e32\u91cc\u7684 SQL&#xff0c;<br \/>\n   \u5982\u679c\u81ea\u5df1\u6ca1\u5199\u53c2\u6570&#xff0c;\u5c31\u4e0d\u4f1a\u88ab\u81ea\u52a8\u53c2\u6570\u5316 \u2014\u2014 \u5b57\u9762\u91cf\u5c31\u662f\u5b57\u9762\u91cf\u3002<\/p>\n<p>   \u5b9e\u6d4b&#xff1a;\u540c\u4e00\u53e5\u9759\u6001 SQL \u8fde\u6267\u884c\u4e24\u6b21&#xff08;\u4ec5\u5b57\u9762\u91cf\u4e0d\u540c&#xff09;&#xff0c;\u89c2\u5bdf\u662f\u5426\u88ab\u53c2\u6570\u5316\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301002-B\u3011\u81ea\u52a8\u53c2\u6570\u5316\u7684\u8fb9\u754c&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;  \u8bf4\u660e&#xff1a;\u672c\u5e93\u5f53\u524d\u662f\u5426\u5f00\u542f\u5f3a\u5236\u53c2\u6570\u5316&#xff1a;&#039;;<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u6570\u636e\u5e93\u53c2\u6570\u5316\u9009\u9879&#039;,<br \/>\n    \u503c   &#061; N&#039;is_parameterization_forced &#061; &#039;<br \/>\n         &#043; CAST(is_parameterization_forced AS nvarchar(5))<br \/>\nFROM sys.databases WHERE name &#061; DB_NAME();<br \/>\nPRINT N&#039;  \u2605 \u5373\u4f7f\u5f00\u542f\u5f3a\u5236\u53c2\u6570\u5316&#xff0c;EXEC(&#039;&#039;&#8230;&#039;&#039;) \u5185\u7684\u5b57\u9762\u91cf\u4e5f\u4e0d\u53d7\u5176\u7ba1\u8f96 \u2014\u2014&#039;;<br \/>\nPRINT N&#039;    \u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u52a8\u6001 SQL \u5fc5\u987b\u3010\u81ea\u5df1\u3011\u53c2\u6570\u5316\u3002&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301003\u3011sp_executesql \u6df1\u5165 \u2014\u2014 \u53c2\u6570\u5316\u7684\u6b63\u786e\u59ff\u52bf\u4e0e\u5168\u90e8\u9677\u9631<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   3.1  \u53c2\u6570\u58f0\u660e\u4e32\u7684\u5199\u6cd5\u4e0e\u5e38\u89c1\u9519\u8bef&#xff08;\u5751 2 \/ \u5751 3&#xff09;<br \/>\n   3.2  \u8f93\u51fa\u53c2\u6570&#xff1a;\u628a\u7ed3\u679c\u5e26\u56de\u8c03\u7528\u8005<br \/>\n   3.3  NULL \u53c2\u6570\u4e0e&#034;\u53ef\u9009\u6761\u4ef6&#034;\u7684\u4e09\u79cd\u5199\u6cd5<br \/>\n   3.4  \u7c7b\u578b\u4e0d\u5339\u914d\u7684\u9759\u9ed8\u884c\u4e3a&#xff08;\u6bd4\u62a5\u9519\u66f4\u53ef\u6015&#xff09;<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301003\u3011sp_executesql \u6df1\u5165&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   3.1  \u53c2\u6570\u58f0\u660e\u4e32&#xff1a;\u5199\u6cd5\u4e0e\u4e09\u4e2a\u5fc5\u8e29\u7684\u5751<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 3.1  \u53c2\u6570\u58f0\u660e\u4e32\u7684\u4e09\u4e2a\u5751 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;sql nvarchar(500);<br \/>\nDECLARE &#064;cc  char(2) &#061; N&#039;CN&#039;;<br \/>\nDECLARE &#064;n   int     &#061; 3;<\/p>\n<p>\/* \u2713 \u6b63\u786e\u5199\u6cd5 *\/<br \/>\nSET &#064;sql &#061; N&#039;SELECT TOP (&#064;topn) OrderNo, CountryCode, NetAmountUsd &#039;<br \/>\n         &#043; N&#039;FROM erp.SalesOrder WHERE CountryCode &#061; &#064;cc ORDER BY NetAmountUsd DESC;&#039;;<br \/>\nPRINT N&#039;  \u2713 \u6b63\u786e&#xff1a;\u53c2\u6570\u540d\u5e26 &#064;&#xff0c;\u7c7b\u578b\u4e0e\u987a\u5e8f\u4e00\u81f4&#039;;<br \/>\nEXEC sys.sp_executesql &#064;sql, N&#039;&#064;cc char(2), &#064;topn int&#039;, &#064;cc &#061; &#064;cc, &#064;topn &#061; &#064;n;<\/p>\n<p>\/* \u2717 \u5751 2 \u590d\u73b0&#xff1a;\u53c2\u6570\u58f0\u660e\u6f0f\u6389 &#064; \u2014\u2014 \u62a5 102&#xff08;\u89e3\u6790\u671f\u5c31\u77e5\u9053\u9519\u4e86&#xff09;*\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2717 \u5751 2&#xff1a;\u58f0\u660e\u4e32\u5199\u6210 &#039;&#039;cc char(2)&#039;&#039;&#xff08;\u6f0f &#064;&#xff09;\u4f1a\u600e\u6837&#xff1f;&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC sys.sp_executesql &#064;sql, N&#039;cc char(2), topn int&#039;, &#064;cc &#061; &#064;cc, &#064;topn &#061; &#064;n;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;     \u6355\u83b7\u5230\u9519\u8bef &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;     \u2605 \u6559\u8bad&#xff1a;\u58f0\u660e\u4e32\u91cc\u7684\u53d8\u91cf\u540d\u5fc5\u987b\u5e26 &#064;\u3002\u6ce8\u610f\u8fd9\u91cc\u62a5\u7684\u662f 102&#xff08;\u8bed\u6cd5&#xff09;&#xff0c;&#039;;<br \/>\n    PRINT N&#039;       \u800c\u4e0d\u662f 214 \u2014\u2014 \u56e0\u4e3a\u58f0\u660e\u4e32\u672c\u8eab\u8981\u5148\u88ab\u89e3\u6790\u6210\u53d8\u91cf\u5217\u8868\u3002&#039;;<br \/>\nEND CATCH<\/p>\n<p>\/* \u2717 \u5751 2 \u53d8\u4f53&#xff1a;SQL \u91cc\u7528\u4e86\u672a\u58f0\u660e\u7684\u53c2\u6570 *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2717 \u5751 2 \u53d8\u4f53&#xff1a;SQL \u6587\u672c\u91cc\u7528\u4e86 &#064;undeclared&#xff0c;\u4f46\u58f0\u660e\u4e32\u6ca1\u7ed9&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC sys.sp_executesql<br \/>\n         N&#039;SELECT TOP 1 OrderNo FROM erp.SalesOrder WHERE CountryCode &#061; &#064;undeclared;&#039;,<br \/>\n         N&#039;&#064;cc char(2)&#039;, &#064;cc &#061; N&#039;CN&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;     \u6355\u83b7\u5230\u9519\u8bef &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;     \u2605 \u6559\u8bad&#xff1a;SQL \u6587\u672c\u91cc\u51fa\u73b0\u7684\u6bcf\u4e2a &#064;param&#xff0c;\u58f0\u660e\u4e32\u91cc\u90fd\u5fc5\u987b\u6709\u3002&#039;;<br \/>\nEND CATCH<\/p>\n<p>\/* \u2717 \u5751 3 \u590d\u73b0&#xff1a;SQL \u6587\u672c\u7528 varchar \u627f\u8f7d *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2717 \u5751 3&#xff1a;\u628a SQL \u6587\u672c\u88c5\u8fdb varchar \u53d8\u91cf \u2014\u2014 \u62a5 214&#039;;<br \/>\nDECLARE &#064;noN varchar(300) &#061; &#039;SELECT 1 AS x;&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC sys.sp_executesql &#064;noN;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;     \u6355\u83b7\u5230\u9519\u8bef &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;     \u2605 \u6559\u8bad&#xff1a;sp_executesql \u7684 &#064;statement \u53c2\u6570\u7c7b\u578b\u5fc5\u987b\u662f&#039;;<br \/>\n    PRINT N&#039;       nvarchar \/ nchar \/ ntext&#xff0c;\u4f20 varchar \u4f1a\u76f4\u63a5\u62a5 214\u3002&#039;;<br \/>\nEND CATCH<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2713 \u6b63\u786e&#xff1a;\u7528 nvarchar \u627f\u8f7d&#xff0c;\u4e2d\u6587\u624d\u80fd\u5b89\u5168\u901a\u8fc7&#039;;<br \/>\nDECLARE &#064;withN nvarchar(300) &#061; N&#039;SELECT N&#039;&#039;\u4e2d\u6587\u6d4b\u8bd5&#039;&#039; AS \u7ed3\u679c_nvarchar;&#039;;<br \/>\nEXEC sys.sp_executesql &#064;withN;<br \/>\nPRINT N&#039;     \u2605 \u66f4\u8fdb\u4e00\u6b65&#xff1a;SQL \u6587\u672c\u5185\u90e8\u7684\u4e2d\u6587\/Unicode \u5b57\u9762\u91cf\u4e5f\u8981\u52a0 N \u524d\u7f00\u3002&#039;;<br \/>\nPRINT N&#039;       N&#039;&#039;\u4e2d\u6587&#039;&#039;  vs  &#039;&#039;\u4e2d\u6587&#039;&#039; \u2014\u2014 \u540e\u8005\u5728\u6709 Unicode \u5217\u6bd4\u8f83\u65f6\u4f1a\u9690\u5f0f\u8f6c\u6362&#xff0c;&#039;;<br \/>\nPRINT N&#039;       \u65e2\u53ef\u80fd\u4e71\u7801&#xff0c;\u4e5f\u4f1a\u8ba9\u7d22\u5f15\u5931\u6548&#xff08;\u8be6\u89c1 Query Optimization \u7bc7\u7684\u9690\u5f0f\u8f6c\u6362&#xff09;\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   3.2  \u8f93\u51fa\u53c2\u6570&#xff1a;\u628a\u52a8\u6001 SQL \u7684\u7ed3\u679c\u5e26\u56de\u8c03\u7528\u8005<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 3.2  \u8f93\u51fa\u53c2\u6570&#xff08;OUTPUT&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;cnt int, &#064;sumAmt decimal(18,2), &#064;avgAmt decimal(18,2);<br \/>\nDECLARE &#064;sqlAgg nvarchar(600) &#061;<br \/>\n    N&#039;SELECT &#064;oCnt &#061; COUNT(*), &#064;oSum &#061; SUM(NetAmountUsd), &#064;oAvg &#061; AVG(NetAmountUsd) &#039;<br \/>\n  &#043; N&#039;FROM erp.SalesOrder WHERE CountryCode &#061; &#064;pcc;&#039;;<br \/>\nEXEC sys.sp_executesql<br \/>\n     &#064;sqlAgg,<br \/>\n     N&#039;&#064;pcc char(2), &#064;oCnt int OUTPUT, &#064;oSum decimal(18,2) OUTPUT, &#064;oAvg decimal(18,2) OUTPUT&#039;,<br \/>\n     &#064;pcc  &#061; N&#039;FR&#039;,<br \/>\n     &#064;oCnt &#061; &#064;cnt   OUTPUT,<br \/>\n     &#064;oSum &#061; &#064;sumAmt OUTPUT,<br \/>\n     &#064;oAvg &#061; &#064;avgAmt OUTPUT;<\/p>\n<p>SELECT \u56fd\u5bb6 &#061; &#039;FR&#039;, \u8ba2\u5355\u6570 &#061; &#064;cnt,<br \/>\n       \u5408\u8ba1USD &#061; &#064;sumAmt, \u5e73\u5747USD &#061; &#064;avgAmt;<br \/>\nPRINT N&#039;  \u2605 \u8f93\u51fa\u53c2\u6570\u8ba9\u52a8\u6001 SQL \u80fd&#034;\u8fd4\u56de\u503c&#034;&#xff0c;\u8fd9\u662f EXEC \u62fc\u63a5\u505a\u4e0d\u5230\u7684\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6ce8\u610f OUTPUT \u5173\u952e\u5b57\u5728\u58f0\u660e\u4e32\u548c\u8c03\u7528\u5904\u3010\u90fd\u8981\u5199\u3011\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   3.3  &#034;\u53ef\u9009\u6761\u4ef6&#034;\u7684\u4e09\u79cd\u5199\u6cd5\u5bf9\u6bd4<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 3.3  \u53ef\u9009\u6761\u4ef6\u4e09\u5199\u6cd5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u9700\u6c42&#xff1a;\u56fd\u5bb6\u53ef\u9009\u3001\u91d1\u989d\u53ef\u9009\u3001\u72b6\u6001\u53ef\u9009 \u2014\u2014 \u4efb\u610f\u7ec4\u5408\u3002&#039;;<\/p>\n<p>\/* \u5199\u6cd5 A&#xff1a;OR IS NULL \u6a21\u5f0f&#xff08;\u9759\u6001&#xff0c;\u8ba1\u5212\u7a33\u5b9a\u4f46\u7d22\u5f15\u5229\u7528\u7387\u5dee&#xff09;*\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u5199\u6cd5 A&#xff1a;\u9759\u6001 SQL &#043; (col &#061; &#064;p OR &#064;p IS NULL)&#039;;<br \/>\nDECLARE &#064;fC char(2) &#061; N&#039;HK&#039;, &#064;fM decimal(18,2) &#061; NULL, &#064;fS varchar(10) &#061; NULL;<br \/>\nDECLARE &#064;sqlA nvarchar(800) &#061;<br \/>\n    N&#039;SELECT COUNT(*) AS \u547d\u4e2d\u6570 FROM erp.SalesOrder &#039;<br \/>\n  &#043; N&#039;WHERE (&#064;c IS NULL OR CountryCode &#061; &#064;c) &#039;<br \/>\n  &#043; N&#039;  AND (&#064;m IS NULL OR NetAmountUsd &gt;&#061; &#064;m) &#039;<br \/>\n  &#043; N&#039;  AND (&#064;s IS NULL OR Status &#061; &#064;s);&#039;;<br \/>\nEXEC sys.sp_executesql &#064;sqlA, N&#039;&#064;c char(2), &#064;m decimal(18,2), &#064;s varchar(10)&#039;,<br \/>\n     &#064;c &#061; &#064;fC, &#064;m &#061; &#064;fM, &#064;s &#061; &#064;fS;<br \/>\nPRINT N&#039;    \u2713 \u4e00\u6761 SQL \u5e94\u5bf9\u6240\u6709\u7ec4\u5408 \u2192 \u53ea\u7528 1 \u4efd\u8ba1\u5212&#039;;<br \/>\nPRINT N&#039;    \u2717 \u4f18\u5316\u5668\u65e0\u6cd5\u4e3a&#034;\u53ea\u6309\u56fd\u5bb6&#034;\u6700\u4f18\u5730\u9009\u7d22\u5f15&#xff08;\u56e0\u4e3a OR \u8ba9\u5b83\u65e0\u6cd5\u88c1\u526a\u8c13\u8bcd&#xff09;&#039;;<\/p>\n<p>\/* \u5199\u6cd5 B&#xff1a;\u52a8\u6001\u62fc\u63a5 &#043; \u53c2\u6570\u5316&#xff08;\u8ba1\u5212\u6700\u4f18&#xff0c;\u672c\u7cfb\u5217\u63a8\u8350&#xff09;*\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u5199\u6cd5 B&#xff1a;\u52a8\u6001\u62fc\u63a5\u3010\u53ea\u62fc\u51fa\u73b0\u8fc7\u7684\u6761\u4ef6\u3011&#043; sp_executesql \u4f20\u53c2&#039;;<br \/>\n\/* &#xff08;\u590d\u7528\u4e0a\u9762 \u00a73.3 \u5199\u6cd5 A \u5df2\u58f0\u660e\u7684 &#064;fC \/ &#064;fM \/ &#064;fS&#xff0c;\u540c\u4e00\u6279\u6b21\u4e0d\u53ef\u91cd\u590d DECLARE&#xff09;*\/<\/p>\n<p>DECLARE &#064;dyn nvarchar(1000) &#061; N&#039;SELECT COUNT(*) AS \u547d\u4e2d\u6570 FROM erp.SalesOrder WHERE 1&#061;1&#039;;<br \/>\nDECLARE &#064;decl nvarchar(400) &#061; N&#039;&#039;;<br \/>\nIF &#064;fC IS NOT NULL<br \/>\nBEGIN<br \/>\n    SET &#064;dyn  &#043;&#061; N&#039; AND CountryCode &#061; &#064;c&#039;;<br \/>\n    SET &#064;decl &#043;&#061; N&#039;&#064;c char(2),&#039;;<br \/>\nEND<br \/>\nIF &#064;fM IS NOT NULL<br \/>\nBEGIN<br \/>\n    SET &#064;dyn  &#043;&#061; N&#039; AND NetAmountUsd &gt;&#061; &#064;m&#039;;<br \/>\n    SET &#064;decl &#043;&#061; N&#039;&#064;m decimal(18,2),&#039;;<br \/>\nEND<br \/>\nIF &#064;fS IS NOT NULL<br \/>\nBEGIN<br \/>\n    SET &#064;dyn  &#043;&#061; N&#039; AND Status &#061; &#064;s&#039;;<br \/>\n    SET &#064;decl &#043;&#061; N&#039;&#064;s varchar(10),&#039;;<br \/>\nEND<br \/>\nSET &#064;decl &#061; LEFT(&#064;decl, NULLIF(LEN(&#064;decl) &#8211; 1, 0));   \/* \u53bb\u5c3e\u9017\u53f7 *\/<br \/>\nSET &#064;dyn  &#043;&#061; N&#039;;&#039;;<\/p>\n<p>PRINT N&#039;    \u6784\u9020\u51fa\u7684 SQL  &#061; &#039; &#043; &#064;dyn;<br \/>\nPRINT N&#039;    \u53c2\u6570\u58f0\u660e\u4e32    &#061; &#039; &#043; ISNULL(&#064;decl, N&#039;(\u65e0)&#039;);<\/p>\n<p>\/* \u2605 \u5173\u952e\u70b9&#xff1a;sp_executesql \u7684\u5b9e\u53c2\u5fc5\u987b\u4e0e\u58f0\u660e\u4e32\u4e25\u683c\u4e00\u4e00\u5bf9\u5e94&#xff1a;<br \/>\n     \u00b7 \u591a\u4f20\u4e00\u4e2a\u4e0d\u5728\u58f0\u660e\u4e32\u91cc\u7684\u547d\u540d\u53c2\u6570 \u2192 8144\u300c\u6307\u5b9a\u4e86\u8fc7\u591a\u7684\u53c2\u6570\u300d<br \/>\n     \u00b7 \u5728&#034;\u5b9e\u53c2\u4e32&#034;\u91cc\u5199 &#064;fC \u8fd9\u79cd\u5916\u5c42\u53d8\u91cf\u540d \u2192 134&#xff08;\u5185\u5c42\u4f5c\u7528\u57df\u770b\u4e0d\u5230&#xff09;<br \/>\n   \u6240\u4ee5\u6761\u4ef6\u6570\u91cf\u53ef\u53d8\u65f6&#xff0c;\u6709\u4e24\u79cd\u6b63\u786e\u505a\u6cd5&#xff1a;<br \/>\n     \u505a\u6cd5\u2460 \u5168\u90e8\u7528\u56fa\u5b9a\u53c2\u6570 &#043; \u7528 NULL \u8868\u793a&#034;\u4e0d\u542f\u7528&#034;&#xff08;\u7b80\u5355&#xff0c;\u63a8\u8350&#xff09;<br \/>\n     \u505a\u6cd5\u2461 \u52a8\u6001\u62fc\u3010\u4f4d\u7f6e\u5b9e\u53c2\u3011\u7684 EXEC&#xff0c;\u8ba9\u6bcf\u4e2a\u503c\u90fd\u7531\u672c\u5c42\u7684\u53d8\u91cf\u4f20\u5165<\/p>\n<p>   \u8fd9\u91cc\u6f14\u793a\u505a\u6cd5\u2461&#xff1a;\u628a\u5b9e\u53c2\u5199\u6210 (&#064;a, &#064;b, &#064;c) \u5f62\u5f0f&#xff0c;\u7528\u53d8\u91cf\u627f\u8f7d\u3002 *\/<br \/>\nDECLARE &#064;a1 nvarchar(30) &#061; CAST(&#064;fC AS nvarchar(30));<br \/>\nDECLARE &#064;a2 nvarchar(30) &#061; CAST(&#064;fM AS nvarchar(30));<br \/>\nDECLARE &#064;a3 nvarchar(30) &#061; CAST(&#064;fS AS nvarchar(30));<\/p>\n<p>\/* \u672c\u4f8b\u53ea\u6709 &#064;c \u751f\u6548&#xff0c;\u6240\u4ee5\u53ea\u4f20\u4e00\u4e2a\u5b9e\u53c2 *\/<br \/>\nIF &#064;fM IS NULL AND &#064;fS IS NULL<br \/>\nBEGIN<br \/>\n    EXEC sp_executesql &#064;dyn, &#064;decl, &#064;c &#061; &#064;a1;<br \/>\nEND<br \/>\nELSE<br \/>\nBEGIN<br \/>\n    \/* \u6f14\u793a&#034;\u5168\u90e8\u751f\u6548&#034;\u7684\u5206\u652f&#xff08;\u672c\u4f8b\u4e0d\u8d70&#xff0c;\u4f46\u5b8c\u6574\u8d77\u89c1\u4fdd\u7559&#xff09;*\/<br \/>\n    EXEC sp_executesql &#064;dyn, &#064;decl, &#064;c &#061; &#064;a1, &#064;m &#061; &#064;a2, &#064;s &#061; &#064;a3;<br \/>\nEND<\/p>\n<p>PRINT N&#039;    \u2713 \u53ea\u51fa\u73b0\u8fc7\u7684\u6761\u4ef6\u624d\u8fdb SQL \u2192 \u4f18\u5316\u5668\u770b\u5230\u6700\u5e72\u51c0\u7684\u8c13\u8bcd&#039;;<br \/>\nPRINT N&#039;    \u2713 \u503c\u4ecd\u8d70\u53c2\u6570\u901a\u9053 \u2192 \u96f6\u6ce8\u5165\u9762&#039;;<br \/>\nPRINT N&#039;    \u2605 \u6ce8\u610f 1&#xff1a;\u52a8\u6001\u62fc SQL \u6587\u672c\u65f6&#xff0c;\u3010\u5b9e\u53c2\u5217\u8868\u3011\u4e5f\u8981\u8ddf\u7740\u6761\u4ef6\u6570\u53d8\u5316&#xff0c;&#039;;<br \/>\nPRINT N&#039;       \u5426\u5219\u62a5 8144&#xff1b;\u800c\u628a\u5916\u5c42\u53d8\u91cf\u540d\u5199\u8fdb\u5b57\u7b26\u4e32\u4f1a\u62a5 134\u3002&#039;;<br \/>\nPRINT N&#039;       \u2192 \u5b9e\u8df5\u4e2d\u66f4\u63a8\u8350\u3010\u56fa\u5b9a\u53c2\u6570 &#043; NULL \u8bed\u4e49\u3011\u7684\u505a\u6cd5&#xff08;\u89c1\u4e0b\u6587\u505a\u6cd5\u2460&#xff09;\u3002&#039;;<br \/>\nPRINT N&#039;    \u2605 \u6ce8\u610f 2&#xff1a;\u4e0d\u540c\u6761\u4ef6\u7ec4\u5408 &#061; \u4e0d\u540c SQL \u6587\u672c &#061; \u4e0d\u540c\u8ba1\u5212&#xff0c;\u8fd9\u662f\u7279\u6027\u4e0d\u662f\u7f3a\u9677\u3002&#039;;<\/p>\n<p>\/* \u505a\u6cd5\u2460&#xff1a;\u56fa\u5b9a\u53c2\u6570 &#043; NULL \u8bed\u4e49&#xff08;\u751f\u4ea7\u4e2d\u6700\u5e38\u7528\u3001\u6700\u4e0d\u6613\u51fa\u9519&#xff09;*\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u505a\u6cd5\u2460&#xff08;\u63a8\u8350&#xff09;&#xff1a;SQL \u7ed3\u6784\u56fa\u5b9a&#xff0c;\u7528&#034;\u6761\u4ef6\u5f00\u5173&#043;\u53c2\u6570&#034;\u7ec4\u5408&#039;<br \/>\nPRINT N&#039;    \u2014\u2014 \u517c\u5f97&#034;\u8ba1\u5212\u590d\u7528&#034;\u4e0e&#034;\u8c13\u8bcd\u5e72\u51c0&#034;&#xff0c;\u4e14\u5b9e\u53c2\u5217\u8868\u6c38\u8fdc\u56fa\u5b9a\u3002&#039;;<\/p>\n<p>DECLARE &#064;useC bit &#061; 1, &#064;useM bit &#061; 0, &#064;useS bit &#061; 0;<br \/>\nDECLARE &#064;pC char(2) &#061; N&#039;HK&#039;, &#064;pM decimal(18,2) &#061; 0, &#064;pS varchar(10) &#061; N&#039;&#039;;<br \/>\nDECLARE &#064;sqlFixed nvarchar(1000) &#061;<br \/>\n    N&#039;SELECT COUNT(*) AS \u547d\u4e2d\u6570 FROM erp.SalesOrder WHERE 1&#061;1 &#039;<br \/>\n  &#043; N&#039; AND (&#064;useC &#061; 0 OR CountryCode &#061; &#064;c) &#039;<br \/>\n  &#043; N&#039; AND (&#064;useM &#061; 0 OR NetAmountUsd &gt;&#061; &#064;m) &#039;<br \/>\n  &#043; N&#039; AND (&#064;useS &#061; 0 OR Status &#061; &#064;s);&#039;;<br \/>\nPRINT N&#039;    SQL&#xff08;\u7ed3\u6784\u56fa\u5b9a&#xff0c;\u6c38\u4e0d\u53d8\u5316&#xff09;&#061; &#039;;<br \/>\nPRINT N&#039;      &#039; &#043; &#064;sqlFixed;<br \/>\nEXEC sp_executesql &#064;sqlFixed,<br \/>\n     N&#039;&#064;useC bit, &#064;useM bit, &#064;useS bit, &#064;c char(2), &#064;m decimal(18,2), &#064;s varchar(10)&#039;,<br \/>\n     &#064;useC &#061; &#064;useC, &#064;useM &#061; &#064;useM, &#064;useS &#061; &#064;useS,<br \/>\n     &#064;c &#061; &#064;pC, &#064;m &#061; &#064;pM, &#064;s &#061; &#064;pS;<br \/>\nPRINT N&#039;    \u2713 \u4e00\u6761 SQL \u6587\u672c\u5e94\u5bf9\u6240\u6709\u7ec4\u5408 \u2192 \u8ba1\u5212\u53ea\u6709 1 \u4efd&#xff08;\u590d\u7528\u6700\u4f73&#xff09;&#039;;<br \/>\nPRINT N&#039;    \u2713 \u5b9e\u53c2\u5217\u8868\u56fa\u5b9a \u2192 \u4e0d\u4f1a\u8e29 8144 \/ 134&#039;;<br \/>\nPRINT N&#039;    \u2713 \u7528 bit \u5f00\u5173\u800c\u975e ISNULL(\u5217) \u2192 \u4e0d\u7834\u574f SARGability&#xff08;\u53ef\u8d70\u7d22\u5f15 Seek&#xff09;&#039;;<br \/>\nPRINT N&#039;    \u2605 \u8fd9\u662f&#034;\u9759\u6001\u7ed3\u6784 &#043; \u52a8\u6001\u5f00\u5173&#034;\u7684\u6298\u4e2d&#xff0c;\u751f\u4ea7\u4e2d 90% \u7684&#034;\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668&#034;&#039;;<br \/>\nPRINT N&#039;      \u9700\u6c42\u90fd\u53ef\u4ee5\u7528\u5b83\u89e3\u51b3\u3002\u53ea\u6709\u5f53\u6761\u4ef6\u7ec4\u5408\u6781\u591a\u3001\u4e14\u8ba1\u5212\u5dee\u5f02\u5de8\u5927\u65f6&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u624d\u503c\u5f97\u4e0a\u505a\u6cd5\u2461&#xff08;\u52a8\u6001\u62fc\u63a5&#xff09;\u3002&#039;;<br \/>\nGO<\/p>\n<p>\/* \u5199\u6cd5 C&#xff1a;\u5168\u90e8\u4f20\u503c &#043; ISNULL \u515c\u5e95&#xff08;\u4e0d\u63a8\u8350&#xff0c;\u4f1a\u7834\u574f SARGability&#xff09;*\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u5199\u6cd5 C&#xff1a;\u628a\u6761\u4ef6\u503c\u5148\u515c\u5e95\u518d\u6bd4\u8f83&#xff08;\u2717 \u7834\u574f SARGability&#xff0c;\u4ec5\u4f5c\u53cd\u4f8b&#xff09;&#039;;<br \/>\nPRINT N&#039;    WHERE CountryCode &#061; ISNULL(&#064;c, CountryCode)&#039;;<br \/>\nPRINT N&#039;    \u2717 \u5217\u88ab\u51fd\u6570\u5305\u88f9 \u2192 \u7d22\u5f15\u5931\u6548&#xff08;\u8be6\u89c1 Query Optimization \u7bc7&#xff09;&#039;;<br \/>\nPRINT N&#039;    \u2717 \u8bed\u4e49\u4e5f\u4e0d\u5bf9&#xff1a;&#064;c \u4e3a NULL \u65f6\u9000\u5316\u4e3a&#034;\u81ea\u6bd4\u8f83&#034;&#xff0c;\u6c38\u8fdc\u4e3a\u771f&#xff0c;\u4f46\u5c11\u4e86 NULL \u884c&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   3.4  \u7c7b\u578b\u4e0d\u5339\u914d\u7684\u9759\u9ed8\u884c\u4e3a<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 3.4  \u7c7b\u578b\u4e0d\u5339\u914d&#xff1a;\u9759\u9ed8\u622a\u65ad\u6bd4\u62a5\u9519\u66f4\u5371\u9669 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;tooLong nvarchar(10) &#061; N&#039;THIS_IS_A_VERY_LONG_NAME&#039;;<br \/>\nDECLARE &#064;sqlT nvarchar(400) &#061; N&#039;SELECT &#064;out AS \u4f20\u5165\u503c;&#039;;<br \/>\nDECLARE &#064;echo nvarchar(60);<br \/>\nEXEC sys.sp_executesql &#064;sqlT, N&#039;&#064;out nvarchar(10)&#039;, &#064;out &#061; &#064;tooLong;<br \/>\nPRINT N&#039;    \u2605 \u53c2\u6570\u58f0\u660e\u4e3a nvarchar(10)&#xff0c;\u4f20\u5165 22 \u5b57\u7b26 \u2192 \u9759\u9ed8\u622a\u65ad\u4e3a\u524d 10 \u5b57\u7b26&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u4e0d\u62a5\u9519\u3001\u4e0d\u8b66\u544a\u3002\u6821\u9a8c\u957f\u5ea6\u5fc5\u987b\u5728\u3010\u5165\u53c2\u5904\u3011\u81ea\u5df1\u505a&#xff0c;\u4e0d\u80fd\u9760\u7c7b\u578b\u515c\u5e95\u3002&#039;;<\/p>\n<p>SELECT<br \/>\n    \u68c0\u67e5\u9879       &#061; N&#039;\u53c2\u6570\u58f0\u660e\u957f\u5ea6 vs \u5b9e\u9645\u503c\u957f\u5ea6&#039;,<br \/>\n    \u58f0\u660e\u957f\u5ea6     &#061; 10,<br \/>\n    \u5b9e\u9645\u957f\u5ea6     &#061; LEN(&#064;tooLong),<br \/>\n    \u7ed3\u8bba         &#061; CASE WHEN LEN(&#064;tooLong) &gt; 10<br \/>\n                        THEN N&#039;\u2717 \u5df2\u88ab\u9759\u9ed8\u622a\u65ad&#xff0c;\u5fc5\u987b\u5165\u53c2\u6821\u9a8c&#039; ELSE N&#039;\u2713 \u5b89\u5168&#039; END;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301004\u3011\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668 \u2014\u2014 \u751f\u4ea7\u7ea7\u52a8\u6001\u67e5\u8be2\u6784\u5efa\u5668<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u9700\u6c42&#xff08;\u73e0\u5b9d\u884c\u4e1a\u5e38\u89c1&#xff09;&#xff1a;\u4e00\u4e2a&#034;\u9ad8\u7ea7\u641c\u7d22&#034;\u9875\u9762&#xff0c;\u7528\u6237\u53ef\u4ee5\u4efb\u610f\u7ec4\u5408&#xff1a;<br \/>\n     \u00b7 \u56fd\u5bb6\/\u5730\u533a&#xff08;\u591a\u9009&#xff09;      \u00b7 \u95e8\u5e97&#xff08;\u591a\u9009&#xff09;<br \/>\n     \u00b7 \u8ba2\u5355\u65e5\u671f\u533a\u95f4           \u00b7 \u91d1\u989d\u533a\u95f4<br \/>\n     \u00b7 \u8ba2\u5355\u72b6\u6001&#xff08;\u591a\u9009&#xff09;       \u00b7 \u5ba2\u6237\u7b49\u7ea7<br \/>\n     \u00b7 \u6392\u5e8f\u5b57\u6bb5 &#043; \u65b9\u5411        \u00b7 \u5206\u9875<br \/>\n   \u8fd9\u662f\u52a8\u6001 SQL \u6700\u5178\u578b\u3001\u4e5f\u6700\u5bb9\u6613\u5199\u9519\u7684\u573a\u666f\u3002<\/p>\n<p>   \u672c\u8282\u5b9e\u73b0\u7684 usp_Dyn_SearchOrders_Dynamic \u6f14\u793a\u5168\u90e8\u6b63\u786e\u59ff\u52bf&#xff1a;<br \/>\n     \u2713 \u503c \u2192 \u53c2\u6570\u5316&#xff08;sp_executesql&#xff09;<br \/>\n     \u2713 \u591a\u9009\u5217\u8868 \u2192 STRING_SPLIT &#043; \u8868\u53d8\u91cf&#xff0c;\u4e0d\u62fc\u8fdb SQL<br \/>\n     \u2713 \u6807\u8bc6\u7b26&#xff08;\u6392\u5e8f\u5217\/\u65b9\u5411&#xff09;\u2192 \u767d\u540d\u5355\u6620\u5c04<br \/>\n     \u2713 \u5206\u9875 \u2192 OFFSET\/FETCH \u53c2\u6570\u5316<br \/>\n     \u2713 \u5168\u8fc7\u7a0b\u5199\u5165\u5ba1\u8ba1\u65e5\u5fd7<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301004\u3011\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668&#xff1a;\u751f\u4ea7\u7ea7\u52a8\u6001\u67e5\u8be2\u6784\u5efa\u5668&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   4.1  \u2605 \u9519\u8bef\u793a\u8303&#xff1a;\u628a&#034;\u52a8\u6001&#034;\u7406\u89e3\u6210&#034;\u4ec0\u4e48\u90fd\u62fc&#034;&#xff08;\u4ec5\u8bb2\u89e3&#xff0c;\u4e0d\u6267\u884c&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u4ee5\u4e0b\u662f\u65e0\u6570\u751f\u4ea7\u4e8b\u6545\u7684\u6839\u6e90\u3002\u8bf7\u4ed4\u7ec6\u770b\u5b83\u9519\u5728\u54ea&#xff1a;<\/p>\n<p>     CREATE PROCEDURE usp_BAD<br \/>\n         &#064;SortColumn nvarchar(50), &#064;SortDir nvarchar(4),<br \/>\n         &#064;Countries  nvarchar(4000), &#064;Keyword nvarchar(100)<br \/>\n     AS<br \/>\n         DECLARE &#064;sql nvarchar(4000) &#061;<br \/>\n             N&#039;SELECT * FROM erp.SalesOrder WHERE 1&#061;1 &#039;;<br \/>\n         &#8212; \u2717 \u9519 1&#xff1a;\u628a\u7528\u6237\u8f93\u5165\u76f4\u63a5\u5f53 SQL \u7247\u6bb5\u62fc\u8fdb\u53bb<br \/>\n         IF &#064;Keyword &lt;&gt; N&#039;&#039;<br \/>\n             SET &#064;sql &#043;&#061; N&#039; AND OrderNo LIKE &#039;&#039;%&#039; &#043; &#064;Keyword &#043; N&#039;%&#039;&#039; &#039;;<br \/>\n         &#8212; \u2717 \u9519 2&#xff1a;\u56fd\u5bb6\u5217\u8868\u76f4\u63a5\u62fc&#xff0c;&#039;CN&#039;&#039;,&#039;&#039;HK \u8fd9\u79cd\u5c31\u6784\u9020\u51fa\u591a\u503c<br \/>\n         IF &#064;Countries &lt;&gt; N&#039;&#039;<br \/>\n             SET &#064;sql &#043;&#061; N&#039; AND CountryCode IN (&#039; &#043; &#064;Countries &#043; N&#039;) &#039;;<br \/>\n         &#8212; \u2717 \u9519 3&#xff1a;\u6392\u5e8f\u5b57\u6bb5\u548c\u65b9\u5411\u76f4\u63a5\u62fc&#xff0c;\u8fd9\u91cc\u662f\u6ce8\u5165\u91cd\u707e\u533a<br \/>\n         SET &#064;sql &#043;&#061; N&#039; ORDER BY &#039; &#043; &#064;SortColumn &#043; N&#039; &#039; &#043; &#064;SortDir;<br \/>\n         EXEC (&#064;sql);<\/p>\n<p>   \u4e09\u4e2a\u81f4\u547d\u7f3a\u9677&#xff1a;<br \/>\n     \u9519 1 \u2192 &#064;Keyword \u4f20 &#039;&#039;x&#039;&#039; OR 1&#061;1 &#8211;&#039; \u5373\u5168\u8868\u6cc4\u9732<br \/>\n     \u9519 2 \u2192 &#064;Countries \u4f20 &#039;CN&#039;&#039;) OR 1&#061;1 &#8211;&#039; \u540c\u4e0a<br \/>\n     \u9519 3 \u2192 &#064;SortColumn \u4f20 &#039;OrderNo; DROP TABLE &#8230; &#8211;&#039; \u540e\u679c\u81ea\u8d1f<br \/>\n     \u5e76\u4e14 EXEC \u62fc\u63a5 \u2192 \u6bcf\u7ec4\u53c2\u6570\u90fd\u662f\u65b0\u8bed\u53e5 \u2192 \u8ba1\u5212\u7f13\u5b58\u7206\u70b8\u3002<\/p>\n<p>   \u4e0b\u9762\u6211\u4eec\u7528\u3010\u6b63\u786e\u5b9e\u73b0\u3011\u9010\u4e00\u89e3\u51b3\u8fd9\u4e09\u4e2a\u95ee\u9898\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 4.1  \u9519\u8bef\u793a\u8303\u7684\u4e09\u4e2a\u81f4\u547d\u7f3a\u9677&#xff08;\u6587\u5b57\u8bb2\u89e3&#xff0c;\u4e0d\u6267\u884c&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u7f3a\u9677   &#061; \u7f3a\u9677,<br \/>\n    \u653b\u51fb\u8f93\u5165 &#061; \u793a\u4f8b\u8f93\u5165,<br \/>\n    \u540e\u679c   &#061; \u540e\u679c<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u9519 1&#xff1a;\u5173\u952e\u5b57\u76f4\u63a5\u62fc&#039;, N&#039;&#039;&#039;x&#039;&#039; OR 1&#061;1 &#8211;&#039;,       N&#039;\u5168\u8868\u6cc4\u9732&#xff0c;WHERE \u88ab\u903b\u8f91\u77ed\u8def&#039;),<br \/>\n    (N&#039;\u9519 2&#xff1a;IN \u5217\u8868\u76f4\u63a5\u62fc&#039;, N&#039;&#039;&#039;CN&#039;&#039;) OR 1&#061;1 &#8211;&#039;,    N&#039;\u540c\u4e0a&#xff0c;\u4e14\u53ef UNION \u7a83\u53d6\u5176\u5b83\u5217&#039;),<br \/>\n    (N&#039;\u9519 3&#xff1a;\u6392\u5e8f\u5217\u76f4\u63a5\u62fc&#039;, N&#039;OrderNo; DROP TABLE &#8230;&#039;, N&#039;\u53ef\u6267\u884c\u4efb\u610f SQL&#xff0c;\u6700\u4e25\u91cd&#039;),<br \/>\n    (N&#039;\u9644\u52a0&#xff1a;EXEC \u800c\u975e\u53c2\u6570\u5316&#039;, N&#039;&#xff08;\u4efb\u610f\u53c2\u6570\u53d8\u5316&#xff09;&#039;,      N&#039;\u8ba1\u5212\u7f13\u5b58\u7206\u70b8&#xff0c;\u5185\u5b58\u88ab\u5403\u5149&#039;)<br \/>\n) v(\u7f3a\u9677, \u793a\u4f8b\u8f93\u5165, \u540e\u679c);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   4.2  \u2605 \u6b63\u786e\u5b9e\u73b0&#xff1a;\u751f\u4ea7\u7ea7\u52a8\u6001\u67e5\u8be2\u6784\u5efa\u5668<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 4.2  \u6b63\u786e\u5b9e\u73b0&#xff1a;usp_Dyn_SearchOrders_Dynamic \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nGO<br \/>\n\/* \u2605 CREATE OR ALTER PROCEDURE \u5fc5\u987b\u662f\u6279\u6b21\u7684\u7b2c\u4e00\u6761\u8bed\u53e5&#xff0c;\u524d\u9762\u5fc5\u987b GO \u65ad\u5f00 *\/<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n    &#064;Countries   nvarchar(200) &#061; NULL,   &#8212; \u591a\u9009&#xff0c;\u9017\u53f7\u5206\u9694&#xff1a;&#039;CN,HK,US&#039;<br \/>\n    &#064;StoreCodes  nvarchar(400) &#061; NULL,   &#8212; \u591a\u9009&#xff0c;\u9017\u53f7\u5206\u9694<br \/>\n    &#064;DateFrom    date          &#061; NULL,<br \/>\n    &#064;DateTo      date          &#061; NULL,<br \/>\n    &#064;MinAmount   decimal(18,2) &#061; NULL,<br \/>\n    &#064;MaxAmount   decimal(18,2) &#061; NULL,<br \/>\n    &#064;Statuses    nvarchar(100) &#061; NULL,   &#8212; \u591a\u9009&#xff1a;&#039;Paid,Shipped&#039;<br \/>\n    &#064;SortKey     nvarchar(40)  &#061; N&#039;OrderDate&#039;,   &#8212; \u2605 \u903b\u8f91\u952e&#xff0c;\u975e\u7269\u7406\u5217\u540d<br \/>\n    &#064;SortDir     nvarchar(4)   &#061; N&#039;DESC&#039;,        &#8212; \u2605 ASC \/ DESC<br \/>\n    &#064;PageNo      int           &#061; 1,<br \/>\n    &#064;PageSize    int           &#061; 20<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<\/p>\n<p>    \/* &#8212;- \u5165\u53c2\u9632\u5fa1&#xff1a;\u5206\u9875\u8fb9\u754c &#8212;- *\/<br \/>\n    SET &#064;PageNo   &#061; ISNULL(NULLIF(&#064;PageNo, 0), 1);<br \/>\n    SET &#064;PageSize &#061; ISNULL(NULLIF(&#064;PageSize, 0), 20);<br \/>\n    IF &#064;PageNo   &lt; 1      SET &#064;PageNo &#061; 1;<br \/>\n    IF &#064;PageSize &lt; 1      SET &#064;PageSize &#061; 20;<br \/>\n    IF &#064;PageSize &gt; 200    SET &#064;PageSize &#061; 200;      &#8212; \u786c\u4e0a\u9650&#xff0c;\u9632\u6b62\u62d6\u5e93<br \/>\n    DECLARE &#064;Offset int &#061; (&#064;PageNo &#8211; 1) * &#064;PageSize;<\/p>\n<p>    \/* &#8212;- \u2605 \u6838\u5fc3&#xff1a;\u6392\u5e8f\u5217\u8d70\u767d\u540d\u5355\u6620\u5c04&#xff0c;\u7edd\u4e0d\u62fc\u7528\u6237\u8f93\u5165 &#8212;- *\/<br \/>\n    DECLARE &#064;OrderCol sysname;<br \/>\n    SELECT &#064;OrderCol &#061; ColumnName<br \/>\n    FROM   dbo.Dyn_AllowedColumn<br \/>\n    WHERE  SchemaName &#061; N&#039;erp&#039; AND TableName &#061; N&#039;SalesOrder&#039;<br \/>\n    AND    IsEnabled &#061; 1<br \/>\n    AND    (<br \/>\n              (&#064;SortKey &#061; N&#039;OrderNo&#039;     AND ColumnName &#061; N&#039;OrderNo&#039;)<br \/>\n           OR (&#064;SortKey &#061; N&#039;OrderDate&#039;   AND ColumnName &#061; N&#039;OrderDate&#039;)<br \/>\n           OR (&#064;SortKey &#061; N&#039;CountryCode&#039; AND ColumnName &#061; N&#039;CountryCode&#039;)<br \/>\n           OR (&#064;SortKey &#061; N&#039;StoreCode&#039;   AND ColumnName &#061; N&#039;StoreCode&#039;)<br \/>\n           OR (&#064;SortKey &#061; N&#039;NetAmountUsd&#039;AND ColumnName &#061; N&#039;NetAmountUsd&#039;)<br \/>\n           OR (&#064;SortKey &#061; N&#039;Status&#039;      AND ColumnName &#061; N&#039;Status&#039;)<br \/>\n           );<\/p>\n<p>    \/* \u767d\u540d\u5355\u6ca1\u547d\u4e2d \u2192 \u56de\u843d\u5230\u5b89\u5168\u7684\u9ed8\u8ba4\u503c&#xff0c;\u800c\u4e0d\u662f\u62a5\u9519\u6216\u653e\u884c *\/<br \/>\n    IF &#064;OrderCol IS NULL SET &#064;OrderCol &#061; N&#039;OrderDate&#039;;<\/p>\n<p>    \/* \u2605 \u65b9\u5411&#xff1a;\u53ea\u5141\u8bb8\u4e24\u4e2a\u5b57\u9762\u91cf\u4e4b\u4e00 *\/<br \/>\n    DECLARE &#064;Dir varchar(4) &#061; CASE WHEN UPPER(&#064;SortDir) &#061; N&#039;ASC&#039; THEN &#039;ASC&#039; ELSE &#039;DESC&#039; END;<\/p>\n<p>    \/* &#8212;- \u591a\u9009\u5217\u8868&#xff1a;\u62c6\u6210\u3010\u4e34\u65f6\u8868\u3011&#xff0c;\u4f5c\u4e3a&#034;\u5173\u7cfb&#034;\u53c2\u4e0e EXISTS&#xff0c;\u4e0d\u8fdb SQL \u6587\u672c &#8212;-<br \/>\n       \u2605 \u5173\u952e\u77e5\u8bc6\u70b9&#xff08;\u672c\u673a\u5b9e\u6d4b&#xff09;&#xff1a;<br \/>\n         \u8868\u53d8\u91cf &#064;tv \u3010\u4e0d\u53ef\u89c1\u3011\u4e8e sp_executesql \u5185\u7684\u52a8\u6001 SQL \u2192 \u62a5 1087<br \/>\n         \u672c\u5730\u4e34\u65f6\u8868 #tmp \u3010\u53ef\u89c1\u3011\u4e8e\u540c\u4e00\u4f1a\u8bdd\u7684\u5d4c\u5957\u52a8\u6001 SQL \u2192 \u6b63\u5e38<br \/>\n         \u6240\u4ee5\u51e1\u662f&#034;\u8981\u628a\u5217\u8868\u4f20\u8fdb\u52a8\u6001 SQL&#034;&#xff0c;\u5fc5\u987b\u7528 #temp \u800c\u4e0d\u662f &#064;table\u3002 *\/<br \/>\n    CREATE TABLE #CountryList (Code nvarchar(20) NOT NULL PRIMARY KEY);<br \/>\n    CREATE TABLE #StoreList   (Code nvarchar(20) NOT NULL PRIMARY KEY);<br \/>\n    CREATE TABLE #StatusList  (Code nvarchar(20) NOT NULL PRIMARY KEY);<\/p>\n<p>    IF &#064;Countries IS NOT NULL<br \/>\n        INSERT INTO #CountryList (Code)<br \/>\n        SELECT DISTINCT UPPER(LTRIM(RTRIM(value)))<br \/>\n        FROM   STRING_SPLIT(&#064;Countries, N&#039;,&#039;)<br \/>\n        WHERE  LTRIM(RTRIM(value)) &lt;&gt; N&#039;&#039;;<\/p>\n<p>    IF &#064;StoreCodes IS NOT NULL<br \/>\n        INSERT INTO #StoreList (Code)<br \/>\n        SELECT DISTINCT UPPER(LTRIM(RTRIM(value)))<br \/>\n        FROM   STRING_SPLIT(&#064;StoreCodes, N&#039;,&#039;)<br \/>\n        WHERE  LTRIM(RTRIM(value)) &lt;&gt; N&#039;&#039;;<\/p>\n<p>    IF &#064;Statuses IS NOT NULL<br \/>\n        INSERT INTO #StatusList (Code)<br \/>\n        SELECT DISTINCT value<br \/>\n        FROM   STRING_SPLIT(&#064;Statuses, N&#039;,&#039;)<br \/>\n        WHERE  LTRIM(RTRIM(value)) &lt;&gt; N&#039;&#039;;<\/p>\n<p>    \/* &#8212;- \u6784\u9020\u52a8\u6001 SQL&#xff1a;\u53ea\u62fc&#034;\u7ed3\u6784&#034;&#xff0c;\u503c\u5168\u90e8\u8d70\u53c2\u6570 &#8212;- *\/<br \/>\n    DECLARE &#064;sql nvarchar(4000) &#061;<br \/>\n        N&#039;SELECT o.OrderNo, o.OrderDate, o.CountryCode, o.StoreCode,<br \/>\n                 o.NetAmountUsd, o.Status<br \/>\n          FROM   erp.SalesOrder o<br \/>\n          WHERE  1 &#061; 1 &#039;;<\/p>\n<p>    \/* \u4e34\u65f6\u8868\u5b58\u5728\u65f6\u624d JOIN&#xff08;\u8fd9\u662f&#034;\u7ed3\u6784&#034;\u53d8\u5316&#xff0c;\u5141\u8bb8\u62fc&#xff09;*\/<br \/>\n    IF EXISTS (SELECT 1 FROM #CountryList)<br \/>\n        SET &#064;sql &#043;&#061; N&#039; AND EXISTS (SELECT 1 FROM #CountryList cl WHERE cl.Code &#061; o.CountryCode) &#039;;<br \/>\n    IF EXISTS (SELECT 1 FROM #StoreList)<br \/>\n        SET &#064;sql &#043;&#061; N&#039; AND EXISTS (SELECT 1 FROM #StoreList sl WHERE sl.Code &#061; o.StoreCode) &#039;;<br \/>\n    IF EXISTS (SELECT 1 FROM #StatusList)<br \/>\n        SET &#064;sql &#043;&#061; N&#039; AND EXISTS (SELECT 1 FROM #StatusList stl WHERE stl.Code &#061; o.Status) &#039;;<\/p>\n<p>    \/* \u8303\u56f4\u6761\u4ef6&#xff1a;\u7528\u53c2\u6570\u5360\u4f4d\u7b26&#xff0c;\u4e0d\u62fc\u503c *\/<br \/>\n    IF &#064;DateFrom  IS NOT NULL SET &#064;sql &#043;&#061; N&#039; AND o.OrderDate   &gt;&#061; &#064;pDateFrom &#039;;<br \/>\n    IF &#064;DateTo    IS NOT NULL SET &#064;sql &#043;&#061; N&#039; AND o.OrderDate   &lt;  &#064;pDateToEnd &#039;;<br \/>\n    IF &#064;MinAmount IS NOT NULL SET &#064;sql &#043;&#061; N&#039; AND o.NetAmountUsd &gt;&#061; &#064;pMinAmt &#039;;<br \/>\n    IF &#064;MaxAmount IS NOT NULL SET &#064;sql &#043;&#061; N&#039; AND o.NetAmountUsd &lt;&#061; &#064;pMaxAmt &#039;;<\/p>\n<p>    \/* \u2605 \u6392\u5e8f\u5217\u5df2\u7ecf\u5728\u767d\u540d\u5355\u91cc\u9a8c\u8bc1\u8fc7&#xff0c;\u8fd9\u91cc\u62fc\u7684\u662f\u3010\u767d\u540d\u5355\u91cc\u7684\u771f\u5b9e\u5217\u540d\u3011&#xff0c;<br \/>\n       \u800c\u4e0d\u662f\u7528\u6237\u8f93\u5165 \u2014\u2014 \u8fd9\u662f\u5b89\u5168\u7684\u3002\u4ecd\u7528 QUOTENAME \u515c\u5e95\u8f6c\u4e49\u3002 *\/<br \/>\n    SET &#064;sql &#043;&#061; N&#039; ORDER BY &#039; &#043; QUOTENAME(&#064;OrderCol) &#043; N&#039; &#039; &#043; &#064;Dir<br \/>\n              &#043; N&#039; OFFSET &#064;pOffset ROWS FETCH NEXT &#064;pPageSize ROWS ONLY;&#039;;<\/p>\n<p>    \/* &#8212;- \u58f0\u660e\u4e32&#xff1a;\u4e0e SQL \u6587\u672c\u4e25\u683c\u5bf9\u5e94 &#8212;- *\/<br \/>\n    DECLARE &#064;decl nvarchar(500) &#061; N&#039;&#064;pDateFrom date, &#064;pDateToEnd date,<br \/>\n                                   &#064;pMinAmt decimal(18,2), &#064;pMaxAmt decimal(18,2),<br \/>\n                                   &#064;pOffset int, &#064;pPageSize int&#039;;<\/p>\n<p>    \/* &#8212;- \u5199\u5ba1\u8ba1\u65e5\u5fd7&#xff08;\u6210\u529f\u4e0e\u5426\u90fd\u8bb0&#xff09;&#8212;- *\/<br \/>\n    INSERT INTO dbo.Dyn_SearchLog<br \/>\n        (ProcName, FilterJson, SqlPreview, ParamCount, Strategy)<br \/>\n    VALUES<br \/>\n        (N&#039;usp_Dyn_SearchOrders_Dynamic&#039;,<br \/>\n         N&#039;{Countries:&#039; &#043; ISNULL(&#064;Countries, N&#039;null&#039;) &#043; N&#039;, Sort:&#039; &#043; &#064;SortKey &#043; N&#039; &#039; &#043; &#064;Dir &#043; N&#039;}&#039;,<br \/>\n         LEFT(&#064;sql, 1000), 6, &#039;dynamic&#039;);<\/p>\n<p>    \/* &#8212;- \u6267\u884c &#8212;- *\/<br \/>\n    DECLARE &#064;t0 datetime2(7) &#061; SYSDATETIME();<br \/>\n    EXEC sys.sp_executesql &#064;sql, &#064;decl,<br \/>\n         &#064;pDateFrom &#061; &#064;DateFrom,<br \/>\n         &#064;pDateToEnd &#061; &#064;DateTo,<br \/>\n         &#064;pMinAmt   &#061; &#064;MinAmount,<br \/>\n         &#064;pMaxAmt   &#061; &#064;MaxAmount,<br \/>\n         &#064;pOffset   &#061; &#064;Offset,<br \/>\n         &#064;pPageSize &#061; &#064;PageSize;<\/p>\n<p>    \/* &#8212;- \u56de\u5199\u8017\u65f6 &#8212;- *\/<br \/>\n    UPDATE TOP (1) dbo.Dyn_SearchLog<br \/>\n    SET    ElapsedUs &#061; DATEDIFF(MICROSECOND, &#064;t0, SYSDATETIME())<br \/>\n    WHERE  ProcName &#061; N&#039;usp_Dyn_SearchOrders_Dynamic&#039;<br \/>\n    AND    LogId &#061; (SELECT MAX(LogId) FROM dbo.Dyn_SearchLog);<br \/>\nEND<\/p>\n<p>PRINT N&#039;  \u00b7 dbo.usp_Dyn_SearchOrders_Dynamic \u521b\u5efa\u5b8c\u6210&#039;;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   4.3  \u6d4b\u8bd5\u5404\u79cd\u6761\u4ef6\u7ec4\u5408<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 4.3  \u6d4b\u8bd5&#xff08;\u6ce8\u610f&#xff1a;\u4e0b\u9762\u7684\u8f93\u5165\u91cc\u3010\u6545\u610f\u5e26\u4e86\u6ce8\u5165\u8f7d\u8377\u3011&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>PRINT N&#039;  \u25b8 \u7528\u4f8b 1&#xff1a;\u5355\u6761\u4ef6&#xff08;\u53ea\u770b\u4e2d\u56fd\u9999\u6e2f&#xff09;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n     &#064;Countries &#061; N&#039;HK&#039;, &#064;PageSize &#061; 3;<\/p>\n<p>PRINT N&#039;  \u25b8 \u7528\u4f8b 2&#xff1a;\u591a\u9009\u56fd\u5bb6 &#043; \u591a\u9009\u72b6\u6001 &#043; \u91d1\u989d\u533a\u95f4&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n     &#064;Countries &#061; N&#039;CN,US,JP&#039;, &#064;Statuses &#061; N&#039;Paid,Shipped&#039;,<br \/>\n     &#064;MinAmount &#061; 30000, &#064;MaxAmount &#061; 50000, &#064;PageSize &#061; 4;<\/p>\n<p>PRINT N&#039;  \u25b8 \u7528\u4f8b 3&#xff1a;\u65e5\u671f\u533a\u95f4 &#043; \u6392\u5e8f&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n     &#064;DateFrom &#061; &#039;2025-01-01&#039;, &#064;DateTo &#061; &#039;2025-07-01&#039;,<br \/>\n     &#064;SortKey &#061; N&#039;NetAmountUsd&#039;, &#064;SortDir &#061; N&#039;ASC&#039;, &#064;PageSize &#061; 4;<\/p>\n<p>PRINT N&#039;  \u25b8 \u7528\u4f8b 4&#xff1a;\u2605 \u6ce8\u5165\u8f7d\u8377\u653b\u51fb\u6392\u5e8f\u5217&#xff08;\u5e94\u88ab\u767d\u540d\u5355\u6321\u4e0b&#xff0c;\u56de\u843d\u5230\u9ed8\u8ba4&#xff09;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n     &#064;Countries &#061; N&#039;HK&#039;,<br \/>\n     &#064;SortKey &#061; N&#039;OrderNo; DROP TABLE dbo.Dyn_InjectionDemo &#8211;&#039;,<br \/>\n     &#064;PageSize &#061; 3;<br \/>\nPRINT N&#039;    \u2605 \u89c2\u5bdf&#xff1a;\u67e5\u8be2\u6b63\u5e38\u8fd4\u56de&#xff08;\u6309 OrderDate DESC \u6392\u5e8f&#xff09;&#xff0c;\u6ca1\u6709\u6267\u884c DROP\u3002&#039;;<br \/>\nPRINT N&#039;      \u56e0\u4e3a &#064;SortKey \u4e0d\u5728\u767d\u540d\u5355\u6620\u5c04\u91cc \u2192 \u56de\u843d\u5230\u9ed8\u8ba4\u5217\u3002&#039;;<\/p>\n<p>PRINT N&#039;  \u25b8 \u7528\u4f8b 5&#xff1a;\u2605 \u6ce8\u5165\u8f7d\u8377\u653b\u51fb\u56fd\u5bb6\u5217\u8868&#xff08;\u5e94\u88ab\u5f53\u4f5c\u666e\u901a\u5b57\u7b26\u4e32&#xff09;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SearchOrders_Dynamic<br \/>\n     &#064;Countries &#061; N&#039;HK&#039;&#039;) OR 1&#061;1 &#8211;&#039;,<br \/>\n     &#064;PageSize &#061; 3;<br \/>\nPRINT N&#039;    \u2605 \u89c2\u5bdf&#xff1a;\u8fd4\u56de 0 \u884c\u3002\u56e0\u4e3a\u8f7d\u8377\u88ab STRING_SPLIT \u62c6\u6210\u3010\u4e00\u4e2a\u5b57\u7b26\u4e32\u3011&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u53bb\u548c CountryCode \u5217\u6bd4\u8f83\u65f6\u6c38\u8fdc\u5339\u914d\u4e0d\u4e0a \u2014\u2014 \u5b83\u53ea\u662f\u6570\u636e&#xff0c;\u4e0d\u662f\u8bed\u6cd5\u3002&#039;;<br \/>\nPRINT N&#039;      \u6ce8\u610f&#xff1a;\u8fd9\u91cc\u4e34\u65f6\u8868\u5217\u7528 nvarchar(20)&#xff0c;\u8f7d\u8377\u80fd\u5b8c\u6574\u5b58\u5165&#xff1b;&#039;;<br \/>\nPRINT N&#039;      \u82e5\u5217\u5bbd\u53ea\u6709 char(2)&#xff0c;\u4f1a\u5148\u62a5 2628\u300c\u5b57\u7b26\u4e32\u5c06\u88ab\u622a\u65ad\u300d\u3002&#039;;<br \/>\nPRINT N&#039;      \u4e24\u79cd\u7ed3\u679c\u90fd\u3010\u4e0d\u4f1a\u3011\u8ba9\u6ce8\u5165\u6210\u529f&#xff0c;\u4f46\u62a5\u9519\u4f1a\u5f71\u54cd\u53ef\u7528\u6027&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u6240\u4ee5\u5217\u5bbd\u8981\u7559\u8db3&#xff0c;\u5e76\u5728\u5165\u53c2\u5904\u505a\u957f\u5ea6\u6821\u9a8c&#xff08;\u89c1 4.5&#xff09;\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   4.5  \u5165\u53c2\u9632\u5fa1&#xff1a;\u957f\u5ea6\u6821\u9a8c\u4e0e\u5408\u6cd5\u6027\u6821\u9a8c\u7684\u6b63\u786e\u4f4d\u7f6e<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 4.5  \u5165\u53c2\u9632\u5fa1\u6e05\u5355 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u9632\u5fa1\u70b9   &#061; \u9632\u5fa1\u70b9,<br \/>\n    \u505a\u6cd5     &#061; \u505a\u6cd5<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u5217\u8868\u957f\u5ea6\u4e0a\u9650&#039;, N&#039;\u62fc\u63a5\u524d\u68c0\u67e5 LEN(&#064;Countries) &lt;&#061; 200&#xff0c;\u8d85\u957f\u76f4\u63a5 RAISERROR \u62d2\u7edd&#039;),<br \/>\n    (N&#039;\u5143\u7d20\u4e2a\u6570\u4e0a\u9650&#039;, N&#039;STRING_SPLIT \u540e COUNT(*) \u68c0\u67e5&#xff0c;\u9632\u6b62 IN \u5217\u8868\u7206\u70b8&#039;),<br \/>\n    (N&#039;\u5143\u7d20\u53d6\u503c\u6821\u9a8c&#039;, N&#039;\u7528 NOT EXISTS(SELECT &#8230; WHERE PATINDEX(&#039;&#039;%[^A-Z]%&#039;&#039;, Code)&gt;0) \u62d2\u7edd\u975e\u5b57\u6bcd&#039;),<br \/>\n    (N&#039;\u65e5\u671f\u533a\u95f4\u65b9\u5411&#039;, N&#039;\u68c0\u67e5 &#064;DateFrom IS NULL OR &#064;DateTo IS NULL OR &#064;DateFrom &lt;&#061; &#064;DateTo&#039;),<br \/>\n    (N&#039;\u91d1\u989d\u533a\u95f4\u65b9\u5411&#039;, N&#039;\u68c0\u67e5 &#064;MinAmount IS NULL OR &#064;MaxAmount IS NULL OR &#064;MinAmount &lt;&#061; &#064;MaxAmount&#039;),<br \/>\n    (N&#039;\u5206\u9875\u4e0a\u9650&#039;,     N&#039;&#064;PageSize \u786c\u7f16\u7801\u4e0a\u9650&#xff08;\u672c\u4f8b 200&#xff09;&#xff0c;\u9632\u6b62\u6df1\u5ea6\u5206\u9875\u62d6\u5e93&#039;),<br \/>\n    (N&#039;\u6392\u5e8f\u5217&#039;,       N&#039;\u767d\u540d\u5355\u6620\u5c04&#xff08;\u672c\u4f8b\u7528 Dyn_AllowedColumn \u8868&#xff09;&#xff0c;\u672a\u547d\u4e2d\u5219\u56de\u843d\u9ed8\u8ba4&#039;),<br \/>\n    (N&#039;\u6392\u5e8f\u65b9\u5411&#039;,     N&#039;CASE WHEN UPPER(&#064;Dir)&#061;&#039;&#039;ASC&#039;&#039; THEN &#039;&#039;ASC&#039;&#039; ELSE &#039;&#039;DESC&#039;&#039; END&#039;),<br \/>\n    (N&#039;\u6807\u8bc6\u7b26\u8f6c\u4e49&#039;,   N&#039;QUOTENAME(&#064;col, &#039;&#039;]&#039;&#039;) \u2014\u2014 \u62fc\u6807\u8bc6\u7b26\u65f6\u6c38\u8fdc\u52a0\u8fd9\u4e00\u5c42&#039;),<br \/>\n    (N&#039;\u503c\u4e00\u5f8b\u53c2\u6570\u5316&#039;, N&#039;\u4efb\u4f55\u6765\u81ea\u5916\u90e8\u7684\u503c&#xff0c;\u90fd\u4e0d\u4ee5\u4efb\u4f55\u5f62\u5f0f\u8fdb\u5165 SQL \u6587\u672c&#039;)<br \/>\n) v(\u9632\u5fa1\u70b9, \u505a\u6cd5);<br \/>\nPRINT N&#039;  \u2605 \u8bb0\u4f4f\u987a\u5e8f&#xff1a;\u5148\u3010\u5165\u53c2\u89c4\u8303\u5316\u4e0e\u6821\u9a8c\u3011&#xff0c;\u518d\u3010\u767d\u540d\u5355\u6620\u5c04\u3011&#xff0c;\u6700\u540e\u3010\u53c2\u6570\u5316\u3011\u3002&#039;;<br \/>\nPRINT N&#039;    \u4e09\u5c42\u7f3a\u4e00\u4e0d\u53ef&#xff0c;\u4f46\u4f18\u5148\u7ea7\u4f9d\u6b21\u9012\u51cf \u2014\u2014 \u53c2\u6570\u5316\u662f\u5e95\u7ebf&#xff0c;\u767d\u540d\u5355\u662f\u6807\u8bc6\u7b26\u7684\u5e95\u7ebf\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   4.4  \u9a8c\u8bc1&#xff1a;\u9776\u573a\u8868\u8fd8\u5728&#xff08;\u8bc1\u660e DROP \u6ce8\u5165\u786e\u5b9e\u5931\u8d25\u4e86&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 4.4  \u9a8c\u8bc1\u6ce8\u5165\u653b\u51fb\u5931\u8d25 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nIF OBJECT_ID(N&#039;dbo.Dyn_InjectionDemo&#039;, N&#039;U&#039;) IS NOT NULL<br \/>\n    PRINT N&#039;  \u2713 \u9776\u573a\u8868 dbo.Dyn_InjectionDemo \u4f9d\u7136\u5b58\u5728 \u2014\u2014 \u6ce8\u5165\u653b\u51fb\u88ab\u6210\u529f\u963b\u6b62\u3002&#039;;<br \/>\nELSE<br \/>\n    PRINT N&#039;  \u2717 \u9776\u573a\u8868\u5df2\u88ab\u5220\u9664 \u2014\u2014 \u6ce8\u5165\u6210\u529f&#xff0c;\u8fd9\u662f\u4e25\u91cd\u95ee\u9898&#xff01;&#039;;<\/p>\n<p>SELECT TOP 5<br \/>\n    \u65e5\u5fd7ID &#061; LogId, \u8bb0\u5f55\u65f6\u95f4 &#061; CONVERT(char(19), LoggedAt, 120),<br \/>\n    \u8fc7\u7a0b &#061; ProcName, \u53c2\u6570\u6458\u8981 &#061; LEFT(FilterJson, 50),<br \/>\n    \u8017\u65f6\u5fae\u79d2 &#061; ElapsedUs<br \/>\nFROM dbo.Dyn_SearchLog ORDER BY LogId DESC;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301005\u3011\u6807\u8bc6\u7b26\u5b89\u5168 \u2014\u2014 QUOTENAME\u3001\u767d\u540d\u5355\u3001\u4e0e&#034;\u5ef6\u8fdf\u540d\u79f0\u89e3\u6790&#034;\u9677\u9631<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u53c2\u6570\u5316\u89e3\u51b3&#034;\u503c&#034;&#xff0c;\u6807\u8bc6\u7b26&#xff08;\u8868\u540d\/\u5217\u540d\/\u6392\u5e8f&#xff09;\u5fc5\u987b\u53e6\u60f3\u529e\u6cd5\u3002<br \/>\n   \u672c\u8282\u628a QUOTENAME \u7684\u8fb9\u754c\u8bb2\u900f&#xff0c;\u5e76\u5b9e\u6d4b\u4e00\u4e2a\u6781\u9690\u853d\u7684\u5751&#xff1a;<br \/>\n   &#034;\u5ef6\u8fdf\u540d\u79f0\u89e3\u6790&#034;&#xff08;Deferred Name Resolution&#xff09;\u2014\u2014\u5bf9\u8c61\u540d\u4e0d\u5b58\u5728\u4e5f\u8981\u5230\u8fd0\u884c\u671f\u624d\u62a5\u9519\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301005\u3011\u6807\u8bc6\u7b26\u5b89\u5168&#xff1a;QUOTENAME \u4e0e\u767d\u540d\u5355&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   5.1  QUOTENAME \u5230\u5e95\u9632\u4ec0\u4e48\u3001\u4e0d\u9632\u4ec0\u4e48<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 5.1  QUOTENAME \u7684\u8fb9\u754c \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>SELECT<br \/>\n    \u8f93\u5165                    &#061; \u8f93\u5165,<br \/>\n    QUOTENAME\u7ed3\u679c           &#061; QUOTENAME(\u8f93\u5165),<br \/>\n    \u5e26\u5355\u5f15\u53f7\u53c2\u6570            &#061; QUOTENAME(\u8f93\u5165, &#039;&#039;&#039;&#039;),<br \/>\n    \u5e26\u53cc\u5f15\u53f7\u53c2\u6570            &#061; QUOTENAME(\u8f93\u5165, &#039;&#034;&#039;),<br \/>\n    \u8bf4\u660e                    &#061; \u8bf4\u660e<br \/>\nFROM (VALUES<br \/>\n    (N&#039;SalesOrder&#039;,      N&#039;\u666e\u901a\u6807\u8bc6\u7b26&#xff0c;\u9ed8\u8ba4\u52a0 []&#039;),<br \/>\n    (N&#039;Order Date&#039;,      N&#039;\u542b\u7a7a\u683c&#xff0c;[] \u8ba9\u5b83\u6210\u4e3a\u5408\u6cd5\u6807\u8bc6\u7b26&#039;),<br \/>\n    (N&#039;weird]; DROP&#8211;&#039;,  N&#039;\u2605 \u542b ] \u548c\u5206\u53f7 \u2014\u2014 QUOTENAME \u4f1a\u628a ] \u8f6c\u4e49\u6210 ]]&#039;),<br \/>\n    (N&#039;a&#039;&#039;b&#039;,            N&#039;\u2605 \u542b\u5355\u5f15\u53f7 \u2014\u2014 \u7528 [] \u65f6\u5355\u5f15\u53f7\u3010\u4e0d\u4f1a\u88ab\u5904\u7406\u3011&#039;),<br \/>\n    (N&#039;[already]&#039;,       N&#039;\u5df2\u5e26\u65b9\u62ec\u53f7&#xff0c;\u4f1a\u88ab\u518d\u5305\u4e00\u5c42&#039;),<br \/>\n    (NULL,               N&#039;NULL \u8f93\u5165\u8fd4\u56de NULL&#039;)<br \/>\n) v(\u8f93\u5165, \u8bf4\u660e);<\/p>\n<p>PRINT N&#039;  \u2605 \u5173\u952e\u8ba4\u77e5&#xff1a;&#039;;<br \/>\nPRINT N&#039;    1) QUOTENAME(&#064;x) \u9ed8\u8ba4\u7528 []&#xff0c;\u5b83\u3010\u53ea\u4fdd\u8bc1\u7ed3\u679c\u662f\u4e00\u4e2a\u5408\u6cd5\u7684\u5b9a\u754c\u6807\u8bc6\u7b26\u3011&#xff0c;&#039;;<br \/>\nPRINT N&#039;       \u4e0d\u4fdd\u8bc1\u8fd9\u4e2a\u6807\u8bc6\u7b26\u3010\u5b58\u5728\u3011\u3001\u4e5f\u4e0d\u4fdd\u8bc1\u5b83\u3010\u5728\u5141\u8bb8\u8303\u56f4\u5185\u3011\u3002&#039;;<br \/>\nPRINT N&#039;    2) &#039;&#039;weird]; DROP&#8211;&#039;&#039; \u7ecf QUOTENAME \u540e\u662f [weird]]; DROP&#8211;]&#xff0c;&#039;;<br \/>\nPRINT N&#039;       \u4f5c\u4e3a\u6807\u8bc6\u7b26\u662f&#034;\u5b89\u5168&#034;\u7684&#xff08;\u6574\u4f53\u5f53\u4e00\u4e2a\u540d\u5b57&#xff09;&#xff0c;\u4f46\u8fd9\u4e2a\u540d\u5b57\u663e\u7136\u4e0d\u662f\u8868\u540d\u3002&#039;;<br \/>\nPRINT N&#039;       \u2192 \u6240\u4ee5 QUOTENAME \u5fc5\u987b\u3010\u914d\u5408\u767d\u540d\u5355\u3011\u624d\u6709\u610f\u4e49\u3002&#039;;<br \/>\nPRINT N&#039;    3) \u62fc\u3010\u503c\u3011\u65f6\u7528 QUOTENAME \u662f\u9519\u7684&#xff08;\u5e94\u53c2\u6570\u5316&#xff09;&#xff1b;&#039;;<br \/>\nPRINT N&#039;       \u62fc\u3010\u6807\u8bc6\u7b26\u3011\u65f6\u7528 QUOTENAME \u662f\u5bf9\u7684&#xff08;\u4f46\u8fd8\u8981\u767d\u540d\u5355&#xff09;\u3002&#039;;<\/p>\n<p>\/* &#8212; \u6f14\u793a&#xff1a;QUOTENAME \u540e\u4ecd\u4e0d\u5b58\u5728\u7684\u8868\u4f1a\u600e\u6837 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6f14\u793a&#xff1a;QUOTENAME \u4e00\u4e2a\u6076\u610f\u8868\u540d&#xff0c;\u770b\u5b83\u53d8\u6210\u4ec0\u4e48&#039;;<br \/>\nDECLARE &#064;evilTable nvarchar(100) &#061; N&#039;erp.SalesOrder; DROP TABLE dbo.Dyn_InjectionDemo &#8211;&#039;;<br \/>\nDECLARE &#064;quoted nvarchar(200) &#061; QUOTENAME(&#064;evilTable);<br \/>\nPRINT N&#039;    \u539f\u59cb    &#061; &#039; &#043; &#064;evilTable;<br \/>\nPRINT N&#039;    QUOTENAME \u540e &#061; &#039; &#043; &#064;quoted;<br \/>\nPRINT N&#039;    \u2605 \u5b83\u6574\u4f53\u6210\u4e86\u4e00\u4e2a&#034;\u6807\u8bc6\u7b26&#034;&#xff0c;\u8bed\u6cd5\u4e0a\u5b89\u5168 \u2014\u2014 \u4f46\u8be5\u5bf9\u8c61\u4e0d\u5b58\u5728&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u4f1a\u5728\u3010\u8fd0\u884c\u671f\u3011\u62a5 208\u300c\u5bf9\u8c61\u540d\u65e0\u6548\u300d\u3002\u89c1 5.3 \u7684\u5ef6\u8fdf\u540d\u79f0\u89e3\u6790\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   5.2  \u767d\u540d\u5355\u6821\u9a8c\u51fd\u6570&#xff1a;\u628a&#034;\u5408\u6cd5&#034;\u5b9a\u4e49\u6e05\u695a<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 5.2  \u767d\u540d\u5355\u6821\u9a8c\u51fd\u6570 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u601d\u8def&#xff1a;\u4e0d\u5224\u65ad&#034;\u4ec0\u4e48\u975e\u6cd5&#034;&#xff0c;\u53ea\u5224\u65ad&#034;\u662f\u5426\u5728\u767d\u540d\u5355\u4e2d&#034;\u2014\u2014 \u9ed8\u8ba4\u62d2\u7edd\u3002&#039;;<br \/>\nGO<br \/>\n\/* \u2605 \u6ce8\u610f&#xff1a;CREATE FUNCTION \/ CREATE PROCEDURE \u5fc5\u987b\u662f\u6279\u6b21\u7684\u7b2c\u4e00\u4e2a\u8bed\u53e5&#xff0c;<br \/>\n   \u6240\u4ee5\u524d\u9762\u5fc5\u987b\u7528 GO \u65ad\u5f00&#xff08;\u5426\u5219\u62a5 111\u300c\u5fc5\u987b\u662f\u67e5\u8be2\u6279\u6b21\u4e2d\u7684\u7b2c\u4e00\u4e2a\u8bed\u53e5\u300d&#xff09;\u3002*\/<br \/>\nCREATE OR ALTER FUNCTION dbo.fn_Dyn_IsSafeIdentifier<br \/>\n(<br \/>\n    &#064;SchemaName sysname,<br \/>\n    &#064;TableName  sysname,<br \/>\n    &#064;ColumnName sysname &#061; NULL<br \/>\n)<br \/>\nRETURNS bit<br \/>\nAS<br \/>\nBEGIN<br \/>\n    IF &#064;ColumnName IS NULL<br \/>\n        RETURN CASE WHEN EXISTS<br \/>\n            (SELECT 1 FROM dbo.Dyn_AllowedTable<br \/>\n             WHERE SchemaName &#061; &#064;SchemaName AND TableName &#061; &#064;TableName AND IsEnabled &#061; 1)<br \/>\n            THEN 1 ELSE 0 END;<\/p>\n<p>    RETURN CASE WHEN EXISTS<br \/>\n        (SELECT 1 FROM dbo.Dyn_AllowedColumn<br \/>\n         WHERE SchemaName &#061; &#064;SchemaName AND TableName &#061; &#064;TableName<br \/>\n           AND ColumnName &#061; &#064;ColumnName AND IsEnabled &#061; 1)<br \/>\n        THEN 1 ELSE 0 END;<br \/>\nEND<br \/>\nGO<\/p>\n<p>PRINT N&#039;  \u00b7 dbo.fn_Dyn_IsSafeIdentifier \u521b\u5efa\u5b8c\u6210&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6821\u9a8c\u7ed3\u679c\u6f14\u793a&#xff1a;&#039;;<br \/>\nSELECT<br \/>\n    \u88ab\u6d4b\u5bf9\u8c61 &#061; \u67b6\u6784 &#043; N&#039;.&#039; &#043; \u8868\u540d &#043; N&#039;.&#039; &#043; \u5217\u540d,<br \/>\n    \u662f\u5426\u653e\u884c &#061; CASE WHEN dbo.fn_Dyn_IsSafeIdentifier(\u67b6\u6784, \u8868\u540d, \u5217\u540d) &#061; 1<br \/>\n                    THEN N&#039;\u2713 \u653e\u884c&#039; ELSE N&#039;\u2717 \u62d2\u7edd&#039; END,<br \/>\n    \u573a\u666f     &#061; \u573a\u666f<br \/>\nFROM (VALUES<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;OrderNo&#039;,      N&#039;\u767d\u540d\u5355\u5185&#xff1a;\u6b63\u5e38\u4e1a\u52a1\u5217&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;NetAmountUsd&#039;, N&#039;\u767d\u540d\u5355\u5185&#xff1a;\u6b63\u5e38\u4e1a\u52a1\u5217&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;Password&#039;,     N&#039;\u767d\u540d\u5355\u5916&#xff1a;\u4e0d\u5b58\u5728\u7684\u5217&#xff0c;\u62d2\u7edd&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;UnitCost&#039;,     N&#039;\u767d\u540d\u5355\u5916&#xff1a;\u654f\u611f\u6210\u672c\u5217&#xff0c;\u62d2\u7edd&#039;),<br \/>\n    (N&#039;dbo&#039;, N&#039;sysusers&#039;,   N&#039;name&#039;,         N&#039;\u767d\u540d\u5355\u5916&#xff1a;\u7cfb\u7edf\u8868&#xff0c;\u62d2\u7edd&#039;),<br \/>\n    (N&#039;erp&#039;, N&#039;SalesOrder; DROP TABLE x &#8211;&#039;, N&#039;OrderNo&#039;, N&#039;\u767d\u540d\u5355\u5916&#xff1a;\u6076\u610f\u8868\u540d&#xff0c;\u62d2\u7edd&#039;)<br \/>\n) v(\u67b6\u6784, \u8868\u540d, \u5217\u540d, \u573a\u666f);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   5.3  \u2605 \u5ef6\u8fdf\u540d\u79f0\u89e3\u6790&#xff08;Deferred Name Resolution&#xff09;\u2014\u2014 \u6700\u9690\u853d\u7684\u5751\u4e4b\u4e00<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u521b\u5efa\u5b58\u50a8\u8fc7\u7a0b\u65f6&#xff0c;SQL Server \u4e0d\u4f1a\u68c0\u67e5\u3010\u5f15\u7528\u7684\u5bf9\u8c61\u662f\u5426\u5b58\u5728\u3011\u3002<br \/>\n   \u8fd9\u610f\u5473\u7740&#xff1a;\u4e00\u4e2a\u6307\u5411\u4e0d\u5b58\u5728\u8868\u7684\u5b58\u50a8\u8fc7\u7a0b\u53ef\u4ee5\u3010\u521b\u5efa\u6210\u529f\u3011&#xff0c;<br \/>\n   \u76f4\u5230\u7b2c\u4e00\u6b21\u8c03\u7528\u624d\u62a5\u9519\u3002<br \/>\n   \u5728\u52a8\u6001 SQL \u91cc\u8fd9\u66f4\u5371\u9669&#xff1a;\u62fc\u63a5\u7684\u8868\u540d\u5728\u8fd0\u884c\u671f\u624d\u88ab\u89e3\u6790&#xff0c;<br \/>\n   \u671f\u95f4\u53ef\u80fd\u5df2\u7ecf\u4ea7\u751f\u526f\u4f5c\u7528&#xff08;\u6bd4\u5982\u4f60\u5df2\u7ecf\u5728\u540c\u4e00\u6279\u6b21\u91cc\u5220\u4e86\u522b\u7684\u4e1c\u897f&#xff09;\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 5.3  \u5ef6\u8fdf\u540d\u79f0\u89e3\u6790\u5b9e\u6d4b \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>\/* \u521b\u5efa\u4e00\u4e2a\u5f15\u7528\u4e86\u4e0d\u5b58\u5728\u8868\u7684\u5b58\u50a8\u8fc7\u7a0b \u2014\u2014 \u6ce8\u610f\u5b83\u80fd\u521b\u5efa\u6210\u529f *\/<br \/>\nGO<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_Demo_Injection<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    SELECT * FROM dbo.ThisTableDoesNotExist_12345;   \/* \u4e0d\u5b58\u5728 *\/<br \/>\nEND<br \/>\nGO<\/p>\n<p>PRINT N&#039;  \u2713 \u5b58\u50a8\u8fc7\u7a0b\u521b\u5efa\u3010\u6210\u529f\u3011\u4e86 \u2014\u2014 \u5c3d\u7ba1\u5b83\u5f15\u7528\u4e86\u4e0d\u5b58\u5728\u7684\u8868\u3002&#039;;<br \/>\nPRINT N&#039;    \u8fd9\u5c31\u662f&#034;\u5ef6\u8fdf\u540d\u79f0\u89e3\u6790&#034;&#xff1a;\u7f16\u8bd1\u671f\u4e0d\u6821\u9a8c\u5bf9\u8c61\u5b58\u5728\u6027\u3002&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u73b0\u5728\u8c03\u7528\u5b83&#xff0c;\u624d\u4f1a\u62a5\u9519&#xff1a;&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC dbo.usp_Dyn_Demo_Injection;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u8fd0\u884c\u671f\u9519\u8bef &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;    \u2605 \u6559\u8bad&#xff1a;\u52a8\u6001 SQL \u62fc\u8868\u540d\u65f6&#xff0c;\u9519\u8bef\u53d1\u751f\u5728\u3010\u8fd0\u884c\u671f\u3011\u3002&#039;;<br \/>\n    PRINT N&#039;      \u5fc5\u987b\u5728\u62fc\u63a5\u3010\u4e4b\u524d\u3011\u7528\u767d\u540d\u5355\u786e\u8ba4\u8868\u540d\u5408\u6cd5\u4e14\u5b58\u5728&#xff0c;&#039;;<br \/>\n    PRINT N&#039;      \u800c\u4e0d\u662f\u6307\u671b SQL Server \u5e2e\u4f60\u62e6\u4f4f\u3002&#039;;<br \/>\nEND CATCH<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   5.4  \u2605 \u6b63\u786e\u59ff\u52bf&#xff1a;\u767d\u540d\u5355 &#043; QUOTENAME \u53cc\u5c42<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 5.4  \u6b63\u786e\u59ff\u52bf&#xff1a;\u767d\u540d\u5355 &#043; QUOTENAME \u53cc\u5c42 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;reqSchema sysname &#061; N&#039;erp&#039;;<br \/>\nDECLARE &#064;reqTable  sysname &#061; N&#039;Product&#039;;<br \/>\nDECLARE &#064;reqCol    sysname &#061; N&#039;Category&#039;;<\/p>\n<p>\/* \u7b2c\u4e00\u5c42&#xff1a;\u767d\u540d\u5355&#xff08;\u9ed8\u8ba4\u62d2\u7edd&#xff09; *\/<br \/>\nIF dbo.fn_Dyn_IsSafeIdentifier(&#064;reqSchema, &#064;reqTable, &#064;reqCol) &#061; 0<br \/>\nBEGIN<br \/>\n    RAISERROR(N&#039;\u6807\u8bc6\u7b26\u4e0d\u5728\u767d\u540d\u5355\u5185&#xff1a;%s.%s.%s&#039;, 16, 1, &#064;reqSchema, &#064;reqTable, &#064;reqCol);<br \/>\nEND<br \/>\nELSE<br \/>\nBEGIN<br \/>\n    \/* \u7b2c\u4e8c\u5c42&#xff1a;QUOTENAME&#xff08;\u515c\u5e95\u8f6c\u4e49&#xff09; *\/<br \/>\n    DECLARE &#064;safeObj nvarchar(200) &#061;<br \/>\n        QUOTENAME(&#064;reqSchema) &#043; N&#039;.&#039; &#043; QUOTENAME(&#064;reqTable);<br \/>\n    DECLARE &#064;safeCol nvarchar(200) &#061; QUOTENAME(&#064;reqCol);<\/p>\n<p>    DECLARE &#064;sql nvarchar(1000) &#061;<br \/>\n        N&#039;SELECT TOP 5 &#039; &#043; &#064;safeCol &#043; N&#039; AS \u54c1\u7c7b, COUNT(*) AS \u5546\u54c1\u6570 &#039;<br \/>\n      &#043; N&#039;FROM &#039; &#043; &#064;safeObj &#043; N&#039; &#039;<br \/>\n      &#043; N&#039;GROUP BY &#039; &#043; &#064;safeCol &#043; N&#039; ORDER BY \u5546\u54c1\u6570 DESC;&#039;;<\/p>\n<p>    PRINT N&#039;    \u751f\u6210 SQL &#061; &#039; &#043; &#064;sql;<br \/>\n    EXEC sys.sp_executesql &#064;sql;<br \/>\n    PRINT N&#039;    \u2713 \u53cc\u5c42\u9632\u62a4&#xff1a;\u767d\u540d\u5355\u51b3\u5b9a&#034;\u80fd\u4e0d\u80fd\u7528&#034;&#xff0c;QUOTENAME \u4fdd\u8bc1&#034;\u8bed\u6cd5\u6b63\u786e&#034;\u3002&#039;;<br \/>\nEND<\/p>\n<p>\/* &#8212; \u53cd\u4f8b&#xff1a;\u6076\u610f\u8868\u540d\u88ab\u767d\u540d\u5355\u62e6\u4e0b &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u53cd\u4f8b&#xff1a;\u540c\u4e00\u4e2a\u65b9\u6cd5&#xff0c;\u4f20\u5165\u6076\u610f\u8868\u540d&#039;;<br \/>\nDECLARE &#064;badTable sysname &#061; N&#039;Product; DROP TABLE dbo.Dyn_InjectionDemo &#8211;&#039;;<br \/>\nIF dbo.fn_Dyn_IsSafeIdentifier(N&#039;erp&#039;, &#064;badTable, N&#039;Sku&#039;) &#061; 0<br \/>\n    PRINT N&#039;    \u2713 \u5df2\u5728\u767d\u540d\u5355\u5c42\u88ab\u62d2\u7edd&#xff1a;&#039; &#043; &#064;badTable;<br \/>\nELSE<br \/>\n    PRINT N&#039;    \u2717 \u653e\u884c\u4e86&#xff08;\u4e0d\u5e94\u53d1\u751f&#xff09;&#039;;<\/p>\n<p>\/* &#8212;- \u6e05\u7406\u6f14\u793a\u7528\u7684\u8fc7\u7a0b &#8212;- *\/<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_Demo_Injection;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   5.5  \u52a8\u6001 SQL \u91cc\u4f7f\u7528\u6807\u8bc6\u7b26\u7684\u56db\u6761\u94c1\u5f8b<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 5.5  \u94c1\u5f8b \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u94c1\u5f8b &#061; \u94c1\u5f8b, \u8bf4\u660e &#061; \u8bf4\u660e<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u94c1\u5f8b 1&#039;, N&#039;\u80fd\u4e0d\u7528\u52a8\u6001\u6807\u8bc6\u7b26\u5c31\u4e0d\u7528&#xff1a;\u8868\u540d\/\u5217\u540d\u56fa\u5b9a\u65f6\u4e00\u5f8b\u5199\u6b7b&#039;),<br \/>\n    (N&#039;\u94c1\u5f8b 2&#039;, N&#039;\u5fc5\u987b\u52a8\u6001\u65f6\u8d70\u767d\u540d\u5355\u8868&#xff08;\u6216\u4ee3\u7801\u5185 CASE \u6620\u5c04&#xff09;&#xff0c;\u9ed8\u8ba4\u62d2\u7edd&#039;),<br \/>\n    (N&#039;\u94c1\u5f8b 3&#039;, N&#039;\u767d\u540d\u5355\u901a\u8fc7\u540e\u518d\u5957 QUOTENAME(\u540d\u79f0, &#039;&#039;&lt;&#039;&#039;) \u505a\u8bed\u6cd5\u515c\u5e95&#039;),<br \/>\n    (N&#039;\u94c1\u5f8b 4&#039;, N&#039;\u7edd\u4e0d\u628a\u7528\u6237\u8f93\u5165&#034;\u90e8\u5206\u5339\u914d&#034;\u8fdb\u6807\u8bc6\u7b26&#xff08;\u5982 &#039;&#039;t_&#039;&#039; &#043; &#064;user&#xff09;&#039;)<br \/>\n) v(\u94c1\u5f8b, \u8bf4\u660e);<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301006\u3011\u6743\u9650\u4e0e\u6267\u884c\u4e0a\u4e0b\u6587 \u2014\u2014 \u52a8\u6001 SQL \u7684\u5b89\u5168\u7eb5\u6df1<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   6.1  \u52a8\u6001 SQL \u5728\u3010\u8c03\u7528\u8005\u3011\u6743\u9650\u4e0b\u8fd0\u884c&#xff08;\u6700\u5e38\u89c1\u7684\u6743\u9650\u56f0\u60d1&#xff09;<br \/>\n   6.2  EXECUTE AS&#xff1a;\u5207\u6362\u6267\u884c\u4e0a\u4e0b\u6587<br \/>\n   6.3  \u6240\u6709\u6743\u94fe&#xff08;Ownership Chain&#xff09;\u4e3a\u4ec0\u4e48\u80fd&#034;\u514d\u6743\u9650&#034;\u8bbf\u95ee\u57fa\u8868<br \/>\n   6.4  \u6a21\u5757\u7b7e\u540d&#xff1a;\u6743\u9650\u6700\u5c0f\u5316\u7684\u7ec8\u6781\u65b9\u6848<br \/>\n   6.5  \u6ce8\u5165\u9632\u5fa1\u7684\u7eb5\u6df1\u4f53\u7cfb\u603b\u7ed3<\/p>\n<p>   \u2605 \u672c\u8282\u6240\u6709\u6743\u9650\u6f14\u793a\u90fd\u5728\u3010\u5f53\u524d\u6570\u636e\u5e93\u5185\u3011\u7528 CREATE USER &#8230; WITHOUT LOGIN<br \/>\n     \u521b\u5efa\u9694\u79bb\u7684\u6d4b\u8bd5\u8eab\u4efd&#xff0c;\u4e0d\u89e6\u78b0\u4efb\u4f55\u670d\u52a1\u5668\u7ea7\u5b89\u5168\u4e3b\u4f53&#xff0c;\u8fd0\u884c\u540e\u7acb\u5373\u6e05\u7406\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301006\u3011\u6743\u9650\u4e0e\u6267\u884c\u4e0a\u4e0b\u6587&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.1  \u6838\u5fc3\u8ba4\u77e5&#xff1a;\u52a8\u6001 SQL \u7684\u6743\u9650\u6765\u81ea\u3010\u8c03\u7528\u8005\u3011&#xff0c;\u4e0d\u662f\u5b58\u50a8\u8fc7\u7a0b<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u9759\u6001 SQL \u5728\u5b58\u50a8\u8fc7\u7a0b\u91cc\u6267\u884c\u65f6\u53d7&#034;\u6240\u6709\u6743\u94fe&#034;\u4fdd\u62a4&#xff1a;<br \/>\n     \u82e5\u8fc7\u7a0b\u4e0e\u57fa\u8868\u540c\u5c5e dbo&#xff0c;\u5219\u53ea\u7ed9 EXECUTE \u6743\u9650\u5373\u53ef\u8bbf\u95ee\u57fa\u8868\u3002<br \/>\n   \u4f46\u52a8\u6001 SQL&#xff08;EXEC \/ sp_executesql&#xff09;\u4f1a\u3010\u6253\u65ad\u6240\u6709\u6743\u94fe\u3011&#xff0c;<br \/>\n   \u56e0\u4e3a\u5b83\u662f\u4e00\u6761\u72ec\u7acb\u7f16\u8bd1\u7684\u8bed\u53e5&#xff0c;\u6743\u9650\u6309\u8c03\u7528\u8005\u8ba1\u7b97\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.1  \u6240\u6709\u6743\u94fe vs \u52a8\u6001 SQL \u7684\u6743\u9650\u65ad\u88c2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u5148\u7528\u4e00\u4e2a\u7b80\u5316\u7684\u5bf9\u7167\u8bf4\u660e&#xff08;\u6587\u5b57&#xff09;&#xff1a;&#039;;<br \/>\nSELECT<br \/>\n    \u573a\u666f &#061; \u573a\u666f,<br \/>\n    \u9700\u8981\u7684\u6743\u9650 &#061; \u9700\u8981\u7684\u6743\u9650,<br \/>\n    \u539f\u56e0 &#061; \u539f\u56e0<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u9759\u6001 SQL \u8fc7\u7a0b&#xff08;\u4e0e\u57fa\u8868\u540c\u5c5e dbo&#xff09;&#039;,<br \/>\n     N&#039;\u53ea\u9700 GRANT EXECUTE ON \u8fc7\u7a0b&#039;,<br \/>\n     N&#039;\u6240\u6709\u6743\u94fe\u8fde\u8d2f&#xff0c;SQL Server \u81ea\u52a8&#034;\u8df3\u8fc7&#034;\u57fa\u8868\u6743\u9650\u68c0\u67e5&#039;),<br \/>\n    (N&#039;\u52a8\u6001 SQL \u8fc7\u7a0b&#xff08;EXEC \/ sp_executesql&#xff09;&#039;,<br \/>\n     N&#039;\u9700\u8981 GRANT SELECT ON \u57fa\u8868&#039;,<br \/>\n     N&#039;\u6240\u6709\u6743\u94fe\u88ab\u6253\u65ad&#xff0c;\u52a8\u6001\u8bed\u53e5\u6309\u3010\u8c03\u7528\u8005\u3011\u6743\u9650\u68c0\u67e5&#039;),<br \/>\n    (N&#039;\u52a8\u6001 SQL &#043; EXECUTE AS OWNER&#039;,<br \/>\n     N&#039;\u53ea\u9700 GRANT EXECUTE ON \u8fc7\u7a0b&#039;,<br \/>\n     N&#039;\u5728\u8fc7\u7a0b\u3010\u6240\u6709\u8005\u3011\u4e0a\u4e0b\u6587\u4e2d\u6267\u884c&#xff0c;\u94fe\u91cd\u65b0\u8fde\u8d2f&#039;),<br \/>\n    (N&#039;\u52a8\u6001 SQL &#043; \u6a21\u5757\u7b7e\u540d&#039;,<br \/>\n     N&#039;\u53ea\u9700 GRANT EXECUTE ON \u8fc7\u7a0b&#039;,<br \/>\n     N&#039;\u7528\u8bc1\u4e66\u7b7e\u540d\u8fc7\u7a0b&#xff0c;\u628a\u8bc1\u4e66\u6743\u9650&#034;\u4f20\u67d3&#034;\u7ed9\u52a8\u6001 SQL&#039;)<br \/>\n) v(\u573a\u666f, \u9700\u8981\u7684\u6743\u9650, \u539f\u56e0);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.2  \u2605 \u5b9e\u6d4b&#xff1a;\u52a8\u6001 SQL \u6253\u65ad\u6240\u6709\u6743\u94fe<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u5efa\u7acb\u9694\u79bb\u6d4b\u8bd5\u8eab\u4efd u_Dyn_TestUser&#xff08;\u65e0\u767b\u5f55\u540d&#xff09;&#xff0c;<br \/>\n   \u7ed9\u5b83 EXECUTE \u6743\u9650\u4f46\u3010\u4e0d\u7ed9\u3011SELECT \u6743\u9650&#xff0c;\u7136\u540e\u5206\u522b\u8c03\u7528<br \/>\n   \u9759\u6001\u8fc7\u7a0b\u4e0e\u52a8\u6001\u8fc7\u7a0b&#xff0c;\u89c2\u5bdf\u7ed3\u679c\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.2  \u2605 \u5b9e\u6d4b&#xff1a;\u52a8\u6001 SQL \u6253\u65ad\u6240\u6709\u6743\u94fe \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nGO<\/p>\n<p>\/* \u5efa\u7acb\u9694\u79bb\u6d4b\u8bd5\u8eab\u4efd *\/<br \/>\nIF EXISTS (SELECT 1 FROM sys.database_principals WHERE name &#061; N&#039;u_Dyn_TestUser&#039;)<br \/>\n    DROP USER u_Dyn_TestUser;<br \/>\nCREATE USER u_Dyn_TestUser WITHOUT LOGIN;<br \/>\nPRINT N&#039;  \u00b7 \u6d4b\u8bd5\u8eab\u4efd u_Dyn_TestUser \u5efa\u7acb\u5b8c\u6210&#xff08;\u65e0\u767b\u5f55\u540d&#xff0c;\u4ec5\u5728\u5e93\u5185&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* \u9759\u6001\u8fc7\u7a0b&#xff1a;\u6240\u6709\u6743\u94fe\u5b8c\u6574 *\/<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_SignedRead<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    SELECT COUNT(*) AS \u9759\u6001\u8bfb\u53d6\u8ba2\u5355\u6570 FROM erp.SalesOrder;<br \/>\nEND<br \/>\nGO<\/p>\n<p>\/* \u52a8\u6001\u8fc7\u7a0b&#xff1a;\u7528 EXEC \u62fc\u63a5&#xff0c;\u6240\u6709\u6743\u94fe\u88ab\u6253\u65ad *\/<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_SignedRead_Dyn<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    EXEC (N&#039;SELECT COUNT(*) AS \u52a8\u6001\u8bfb\u53d6\u8ba2\u5355\u6570 FROM erp.SalesOrder;&#039;);<br \/>\nEND<br \/>\nGO<\/p>\n<p>\/* \u53ea\u6388\u4e88 EXECUTE&#xff0c;\u4e0d\u6388\u4e88\u4efb\u4f55\u8868\u6743\u9650 *\/<br \/>\nGRANT EXECUTE ON dbo.usp_Dyn_SignedRead     TO u_Dyn_TestUser;<br \/>\nGRANT EXECUTE ON dbo.usp_Dyn_SignedRead_Dyn TO u_Dyn_TestUser;<br \/>\nPRINT N&#039;  \u00b7 \u5df2\u53ea\u6388\u4e88 EXECUTE \u6743\u9650&#xff08;\u672a\u6388\u4e88\u4efb\u4f55\u57fa\u8868 SELECT \u6743\u9650&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#8212; \u6d4b\u8bd5 1&#xff1a;\u9759\u6001\u8fc7\u7a0b&#xff08;\u5e94\u6210\u529f&#xff0c;\u6240\u6709\u6743\u94fe\u751f\u6548&#xff09;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6d4b\u8bd5 1&#xff1a;\u4ee5 u_Dyn_TestUser \u8eab\u4efd\u8c03\u7528\u3010\u9759\u6001\u3011\u8fc7\u7a0b&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC dbo.usp_Dyn_SignedRead;<br \/>\n    PRINT N&#039;    \u2713 \u6210\u529f \u2014\u2014 \u6240\u6709\u6743\u94fe\u8ba9\u8fc7\u7a0b\u53ef\u4ee5\u8bbf\u95ee\u540c\u5c5e dbo \u7684\u57fa\u8868\u3002&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2717 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\nEND CATCH<br \/>\nREVERT;<\/p>\n<p>\/* &#8212; \u6d4b\u8bd5 2&#xff1a;\u52a8\u6001\u8fc7\u7a0b&#xff08;\u5e94\u5931\u8d25 229&#xff0c;\u6743\u9650\u4e0d\u8db3&#xff09;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6d4b\u8bd5 2&#xff1a;\u4ee5 u_Dyn_TestUser \u8eab\u4efd\u8c03\u7528\u3010\u52a8\u6001\u3011\u8fc7\u7a0b&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC dbo.usp_Dyn_SignedRead_Dyn;<br \/>\n    PRINT N&#039;    \u2713 \u6210\u529f&#xff08;\u82e5\u51fa\u73b0\u6b64\u884c&#xff0c;\u8bf4\u660e\u6240\u6709\u6743\u94fe\u672a\u88ab\u6253\u65ad&#xff09;&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2717 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;    \u2605 \u8fd9\u5c31\u662f\u91cd\u70b9&#xff1a;\u52a8\u6001 SQL \u7684\u6743\u9650\u68c0\u67e5\u6309\u3010\u8c03\u7528\u8005\u3011\u505a&#xff0c;&#039;;<br \/>\n    PRINT N&#039;      \u6240\u6709\u6743\u94fe\u88ab\u6253\u65ad \u2192 \u5373\u4f7f\u8fc7\u7a0b\u672c\u8eab\u53ef\u6267\u884c&#xff0c;\u57fa\u8868\u4e5f\u8bfb\u4e0d\u5230\u3002&#039;;<br \/>\n    PRINT N&#039;      \u8fd9\u662f\u5f88\u591a&#034;\u672c\u5730\u80fd\u8dd1\u3001\u4e0a\u7ebf 229&#034;\u95ee\u9898\u7684\u6839\u56e0\u3002&#039;;<br \/>\nEND CATCH<br \/>\nREVERT;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.3  \u2605 \u89e3\u6cd5\u4e00&#xff1a;EXECUTE AS OWNER<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u8ba9\u8fc7\u7a0b\u4ee5\u3010\u6240\u6709\u8005\u3011(dbo) \u7684\u8eab\u4efd\u6267\u884c\u52a8\u6001 SQL&#xff0c;\u94fe\u91cd\u65b0\u8fde\u8d2f\u3002<br \/>\n   \u4f18\u70b9&#xff1a;\u4e00\u884c\u641e\u5b9a\u3002\u7f3a\u70b9&#xff1a;\u6743\u9650&#034;\u8fc7\u5bbd&#034;\u2014\u2014\u8fc7\u7a0b\u4e2d\u6240\u6709\u4ee3\u7801\u90fd\u83b7\u5f97 dbo \u6743\u9650\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.3  \u89e3\u6cd5\u4e00&#xff1a;EXECUTE AS OWNER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nGO<\/p>\n<p>CREATE OR ALTER PROCEDURE dbo.usp_Dyn_SignedRead_Dyn<br \/>\nWITH EXECUTE AS OWNER<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    EXEC (N&#039;SELECT COUNT(*) AS \u52a8\u6001\u8bfb\u53d6\u8ba2\u5355\u6570 FROM erp.SalesOrder;&#039;);<br \/>\nEND<br \/>\nGO<\/p>\n<p>PRINT N&#039;  \u00b7 \u5df2\u628a usp_Dyn_SignedRead_Dyn \u6539\u4e3a WITH EXECUTE AS OWNER&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u518d\u6b21\u4ee5 u_Dyn_TestUser \u8eab\u4efd\u8c03\u7528&#xff1a;&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC dbo.usp_Dyn_SignedRead_Dyn;<br \/>\n    PRINT N&#039;    \u2713 \u6210\u529f \u2014\u2014 EXECUTE AS OWNER \u8ba9\u52a8\u6001 SQL \u4ee5 dbo \u8eab\u4efd\u8fd0\u884c\u3002&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2717 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\nEND CATCH<br \/>\nREVERT;<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u5bf9\u6bd4\u6d4b\u8bd5&#xff1a;\u4ee5 u_Dyn_TestUser \u8eab\u4efd\u76f4\u63a5\u67e5\u57fa\u8868&#xff08;\u5e94\u5931\u8d25&#xff09;&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    SELECT TOP 1 OrderNo FROM erp.SalesOrder;<br \/>\n    PRINT N&#039;    \u2717 \u610f\u5916\u6210\u529f&#xff08;\u4e0d\u5e94\u53d1\u751f&#xff09;&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2713 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;    \u2605 \u5173\u952e&#xff1a;\u7528\u6237\u3010\u4ecd\u7136\u65e0\u6cd5\u3011\u76f4\u63a5\u8bbf\u95ee\u57fa\u8868&#xff0c;&#039;;<br \/>\n    PRINT N&#039;      \u53ea\u80fd\u901a\u8fc7\u6211\u4eec\u63a7\u5236\u7684\u8fc7\u7a0b\u8bbf\u95ee \u2192 \u6743\u9650\u6700\u5c0f\u5316\u8fbe\u6210\u3002&#039;;<br \/>\nEND CATCH<br \/>\nREVERT;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.4  \u2605 \u89e3\u6cd5\u4e8c&#xff1a;\u6a21\u5757\u7b7e\u540d&#xff08;\u66f4\u7cbe\u786e\u7684\u6743\u9650\u6388\u4e88&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   EXECUTE AS OWNER \u7684\u95ee\u9898\u662f&#034;\u7ed9\u4e86\u5168\u90e8\u6743\u9650&#034;\u3002<br \/>\n   \u6a21\u5757\u7b7e\u540d\u53ef\u4ee5\u53ea\u6388\u4e88\u52a8\u6001 SQL \u771f\u6b63\u9700\u8981\u7684\u6743\u9650&#xff08;\u4f8b\u5982\u53ea\u8bfb\u4e00\u5f20\u8868&#xff09;\u3002<\/p>\n<p>   \u6b65\u9aa4&#xff1a;<br \/>\n     1) CREATE CERTIFICATE&#xff08;\u542b\u79c1\u94a5&#xff09;<br \/>\n     2) ADD SIGNATURE TO \u8fc7\u7a0b BY CERTIFICATE<br \/>\n     3) CREATE USER FROM CERTIFICATE<br \/>\n     4) GRANT \u7cbe\u786e\u6743\u9650 TO \u8be5\u8bc1\u4e66\u7528\u6237<br \/>\n     5) \u5220\u9664\u79c1\u94a5&#xff08;\u53ef\u9009&#xff0c;\u7b7e\u540d\u540e\u4e0d\u518d\u9700\u8981&#xff09;<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.4  \u89e3\u6cd5\u4e8c&#xff1a;\u6a21\u5757\u7b7e\u540d&#xff08;\u7cbe\u7ec6\u6743\u9650&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nGO<\/p>\n<p>\/* 0) \u5efa\u8bc1\u4e66\u9700\u8981\u6570\u636e\u5e93\u4e3b\u5bc6\u94a5&#xff08;\u7528 EXPIRY_DATE \/ \u79c1\u94a5\u65f6\u4f1a\u5f3a\u5236\u8981\u6c42&#xff09;<br \/>\n      \u2605 \u5751&#xff1a;\u6ca1\u6709\u4e3b\u5bc6\u94a5\u65f6\u62a5 15581<br \/>\n        \u300c\u8bf7\u5728\u6267\u884c\u6b64\u64cd\u4f5c\u4e4b\u524d&#xff0c;\u5728\u6570\u636e\u5e93\u4e2d\u521b\u5efa\u4e3b\u5bc6\u94a5&#xff0c;\u6216\u5728\u4f1a\u8bdd\u4e2d\u6253\u5f00\u8be5\u4e3b\u5bc6\u94a5\u300d<br \/>\n      \u2605 \u751f\u4ea7\u4e0a\u4e3b\u5bc6\u94a5\u5bc6\u7801\u8981\u59a5\u5584\u4fdd\u7ba1&#xff0c;\u4e14\u5e94\u505a BACKUP MASTER KEY *\/<br \/>\nIF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name &#061; N&#039;##MS_DatabaseMasterKey##&#039;)<br \/>\nBEGIN<br \/>\n    CREATE MASTER KEY ENCRYPTION BY PASSWORD &#061; N&#039;Dyn&#064;Demo#2025!Key&#039;;<br \/>\n    PRINT N&#039;  \u00b7 \u6b65\u9aa4 0&#xff1a;\u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5df2\u521b\u5efa&#039;;<br \/>\nEND<br \/>\nELSE<br \/>\n    PRINT N&#039;  \u00b7 \u6b65\u9aa4 0&#xff1a;\u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5df2\u5b58\u5728&#xff08;\u8df3\u8fc7&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* 1) \u5efa\u8bc1\u4e66&#xff08;\u4ec5\u5e93\u5185&#xff0c;\u4e0d\u5bfc\u51fa&#xff09; *\/<br \/>\nIF NOT EXISTS (SELECT 1 FROM sys.certificates WHERE name &#061; N&#039;Cert_Dyn_SignedReader&#039;)<br \/>\n    CREATE CERTIFICATE Cert_Dyn_SignedReader<br \/>\n        WITH SUBJECT &#061; N&#039;\u52a8\u6001 SQL \u53ea\u8bfb\u7b7e\u540d\u8bc1\u4e66&#039;, EXPIRY_DATE &#061; N&#039;20351231&#039;;<br \/>\nPRINT N&#039;  \u00b7 \u6b65\u9aa4 1&#xff1a;\u8bc1\u4e66 Cert_Dyn_SignedReader \u5c31\u7eea&#039;;<br \/>\nGO<\/p>\n<p>\/* \u628a\u52a8\u6001\u8fc7\u7a0b\u6539\u56de\u4e0d\u5e26 EXECUTE AS&#xff0c;\u6539\u7531\u7b7e\u540d\u6388\u6743 *\/<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_SignedRead_Dyn2<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    EXEC (N&#039;SELECT COUNT(*) AS \u7b7e\u540d\u8bfb\u53d6\u8ba2\u5355\u6570 FROM erp.SalesOrder;&#039;);<br \/>\nEND<br \/>\nGO<\/p>\n<p>\/* 2) \u7ed9\u8fc7\u7a0b\u52a0\u7b7e\u540d *\/<br \/>\nADD SIGNATURE TO dbo.usp_Dyn_SignedRead_Dyn2 BY CERTIFICATE Cert_Dyn_SignedReader;<br \/>\nPRINT N&#039;  \u00b7 \u6b65\u9aa4 2&#xff1a;\u5df2\u7528\u8bc1\u4e66\u7ed9\u8fc7\u7a0b\u7b7e\u540d&#039;;<br \/>\nGO<\/p>\n<p>\/* 3) \u4ece\u8bc1\u4e66\u521b\u5efa\u6570\u636e\u5e93\u7528\u6237 *\/<br \/>\nIF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name &#061; N&#039;u_Dyn_CertReader&#039;)<br \/>\n    CREATE USER u_Dyn_CertReader FROM CERTIFICATE Cert_Dyn_SignedReader;<br \/>\nPRINT N&#039;  \u00b7 \u6b65\u9aa4 3&#xff1a;\u5df2\u4ece\u8bc1\u4e66\u521b\u5efa\u7528\u6237 u_Dyn_CertReader&#039;;<br \/>\nGO<\/p>\n<p>\/* 4) \u53ea\u6388\u4e88\u3010\u7cbe\u786e\u7684\u3011SELECT \u6743\u9650&#xff08;\u8fd9\u4e00\u5f20\u8868&#xff09; *\/<br \/>\nGRANT SELECT ON OBJECT::erp.SalesOrder TO u_Dyn_CertReader;<br \/>\nGRANT EXECUTE ON dbo.usp_Dyn_SignedRead_Dyn2 TO u_Dyn_TestUser;<br \/>\nPRINT N&#039;  \u00b7 \u6b65\u9aa4 4&#xff1a;\u5df2\u6388\u4e88\u8bc1\u4e66\u7528\u6237 erp.SalesOrder \u7684 SELECT&#039;;<br \/>\nPRINT N&#039;           \u5df2\u6388\u4e88\u6d4b\u8bd5\u7528\u6237\u8be5\u8fc7\u7a0b\u7684 EXECUTE&#039;;<br \/>\nGO<\/p>\n<p>\/* 5) \u6d4b\u8bd5&#xff1a;\u7b7e\u540d\u8fc7\u7a0b\u5e94\u53ef\u7528&#xff0c;\u5176\u5b83\u8868\u4ecd\u4e0d\u53ef\u8bbf\u95ee *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6d4b\u8bd5&#xff1a;\u4ee5 u_Dyn_TestUser \u8eab\u4efd\u8c03\u7528\u7b7e\u540d\u8fc7\u7a0b&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC dbo.usp_Dyn_SignedRead_Dyn2;<br \/>\n    PRINT N&#039;    \u2713 \u6210\u529f \u2014\u2014 \u7b7e\u540d\u628a\u8bc1\u4e66\u7528\u6237\u7684\u6743\u9650&#034;\u4f20\u67d3&#034;\u7ed9\u4e86\u52a8\u6001 SQL\u3002&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2717 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\nEND CATCH<br \/>\nREVERT;<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u5bf9\u7167&#xff1a;\u540c\u540d\u7528\u6237\u8bbf\u95ee\u3010\u672a\u6388\u6743\u3011\u7684\u8868 crm.Customer&#xff08;\u5e94\u5931\u8d25&#xff09;&#039;;<br \/>\nEXECUTE AS USER &#061; N&#039;u_Dyn_TestUser&#039;;<br \/>\nBEGIN TRY<br \/>\n    SELECT TOP 1 CustomerNo FROM crm.Customer;<br \/>\n    PRINT N&#039;    \u2717 \u610f\u5916\u6210\u529f&#xff08;\u4e0d\u5e94\u53d1\u751f&#xff09;&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u2713 \u5931\u8d25 &#039; &#043; CAST(ERROR_NUMBER() AS nvarchar(10))<br \/>\n        &#043; N&#039;&#xff1a;&#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;    \u2605 \u8fd9\u5c31\u662f\u6a21\u5757\u7b7e\u540d\u7684\u4ef7\u503c&#xff1a;\u6743\u9650\u3010\u7cbe\u786e\u5230\u8868\u3011&#xff0c;&#039;;<br \/>\n    PRINT N&#039;      \u800c\u4e0d\u662f\u50cf EXECUTE AS OWNER \u90a3\u6837\u62ff\u5230\u5168\u90e8\u6743\u9650\u3002&#039;;<br \/>\nEND CATCH<br \/>\nREVERT;<br \/>\nGO<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.5  \u4e24\u79cd\u65b9\u6848\u5bf9\u6bd4<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.5  EXECUTE AS OWNER vs \u6a21\u5757\u7b7e\u540d \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u65b9\u6848 &#061; \u65b9\u6848, \u6388\u4e88\u7c92\u5ea6 &#061; \u6388\u4e88\u7c92\u5ea6, \u5178\u578b\u573a\u666f &#061; \u5178\u578b\u573a\u666f, \u6ce8\u610f\u4e8b\u9879 &#061; \u6ce8\u610f\u4e8b\u9879<br \/>\nFROM (VALUES<br \/>\n    (N&#039;EXECUTE AS OWNER&#039;, N&#039;\u7c97&#xff08;\u8fc7\u7a0b\u5185\u6240\u6709\u4ee3\u7801\u83b7 owner \u6743\u9650&#xff09;&#039;,<br \/>\n     N&#039;\u5185\u90e8\u5de5\u5177\u8fc7\u7a0b\u3001\u5feb\u901f\u4fee\u590d&#039;, N&#039;\u6ce8\u610f owner \u662f\u8c01&#xff1b;\u907f\u514d\u8fc7\u7a0b\u88ab\u6539\u540e\u6743\u9650\u5931\u63a7&#039;),<br \/>\n    (N&#039;EXECUTE AS &#039;&#039;user&#039;&#039;&#039;, N&#039;\u4e2d&#xff08;\u5207\u6362\u4e3a\u6307\u5b9a\u7528\u6237&#xff09;&#039;,<br \/>\n     N&#039;\u8de8\u6a21\u5757\u8c03\u7528\u3001\u6d4b\u8bd5&#039;, N&#039;\u9700\u8981\u6709 IMPERSONATE \u6743\u9650&#039;),<br \/>\n    (N&#039;\u6a21\u5757\u7b7e\u540d&#039;, N&#039;\u7ec6&#xff08;\u53ef\u7cbe\u786e\u5230\u5355\u8868\u5355\u64cd\u4f5c&#xff09;&#039;,<br \/>\n     N&#039;\u751f\u4ea7\u6838\u5fc3\u3001\u6743\u9650\u6700\u5c0f\u5316\u8981\u6c42\u9ad8&#039;, N&#039;\u8bc1\u4e66\/\u79c1\u94a5\u8981\u59a5\u5584\u4fdd\u7ba1&#xff1b;\u6539\u8fc7\u7a0b\u540e\u7b7e\u540d\u5931\u6548&#039;),<br \/>\n    (N&#039;\u76f4\u63a5\u6388\u6743\u8c03\u7528\u8005&#039;, N&#039;\u6700\u7c97&#xff08;\u7528\u6237\u53ef\u7ed5\u8fc7\u8fc7\u7a0b\u76f4\u63a5\u67e5\u8868&#xff09;&#039;,<br \/>\n     N&#039;\u4ec5\u9650\u5185\u90e8\u53ef\u4fe1\u7528\u6237&#039;, N&#039;\u4e0d\u63a8\u8350\u7528\u4e8e\u5916\u90e8\u8f93\u5165\u573a\u666f&#039;)<br \/>\n) v(\u65b9\u6848, \u6388\u4e88\u7c92\u5ea6, \u5178\u578b\u573a\u666f, \u6ce8\u610f\u4e8b\u9879);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   6.6  \u6ce8\u5165\u9632\u5fa1\u7eb5\u6df1\u4f53\u7cfb&#xff08;\u4e94\u5c42&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 6.6  \u6ce8\u5165\u9632\u5fa1\u7684\u4e94\u5c42\u7eb5\u6df1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u5c42\u7ea7 &#061; \u5c42\u7ea7, \u63aa\u65bd &#061; \u63aa\u65bd, \u62e6\u4f4f\u4ec0\u4e48 &#061; \u62e6\u4f4f\u4ec0\u4e48<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u7b2c 1 \u5c42&#039;, N&#039;\u53c2\u6570\u5316&#xff08;sp_executesql \/ \u5f3a\u7c7b\u578b\u53c2\u6570&#xff09;&#039;, N&#039;\u6240\u6709&#034;\u503c&#034;\u7c7b\u6ce8\u5165&#xff08;OR 1&#061;1\u3001UNION\u3001\u5806\u53e0&#xff09;&#039;),<br \/>\n    (N&#039;\u7b2c 2 \u5c42&#039;, N&#039;\u6807\u8bc6\u7b26\u767d\u540d\u5355 &#043; QUOTENAME&#039;,            N&#039;\u6240\u6709&#034;\u7ed3\u6784&#034;\u7c7b\u6ce8\u5165&#xff08;\u8868\u540d\/\u5217\u540d\/\u6392\u5e8f&#xff09;&#039;),<br \/>\n    (N&#039;\u7b2c 3 \u5c42&#039;, N&#039;\u5165\u53c2\u6821\u9a8c&#xff08;\u957f\u5ea6\/\u8303\u56f4\/\u683c\u5f0f\/\u679a\u4e3e&#xff09;&#039;,      N&#039;\u8d85\u957f\u3001\u8d8a\u754c\u3001\u975e\u6cd5\u683c\u5f0f\u7684\u7578\u5f62\u8f93\u5165&#039;),<br \/>\n    (N&#039;\u7b2c 4 \u5c42&#039;, N&#039;\u6700\u5c0f\u6743\u9650&#xff08;EXECUTE AS \/ \u6a21\u5757\u7b7e\u540d&#xff09;&#039;,    N&#039;\u5373\u4f7f\u6ce8\u5165\u6210\u529f&#xff0c;\u4e5f\u8bfb\u4e0d\u5230\/\u6539\u4e0d\u4e86\u654f\u611f\u6570\u636e&#039;),<br \/>\n    (N&#039;\u7b2c 5 \u5c42&#039;, N&#039;\u5ba1\u8ba1\u4e0e\u76d1\u63a7&#xff08;Dyn_SearchLog &#043; \u6269\u5c55\u4e8b\u4ef6&#xff09;&#039;, N&#039;\u53ca\u65f6\u53d1\u73b0\u5f02\u5e38\u6a21\u5f0f&#xff0c;\u4e8b\u540e\u8ffd\u6eaf&#039;)<br \/>\n) v(\u5c42\u7ea7, \u63aa\u65bd, \u62e6\u4f4f\u4ec0\u4e48);<br \/>\nPRINT N&#039;  \u2605 \u5355\u9760\u4efb\u4f55\u4e00\u5c42\u90fd\u4e0d\u591f\u3002\u53c2\u6570\u5316\u662f\u5e95\u7ebf&#xff08;\u7b2c 1 \u5c42&#xff09;&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u6700\u5c0f\u6743\u9650\u662f\u6700\u540e\u7684\u515c\u5e95&#xff08;\u7b2c 4 \u5c42&#xff09;\u2014\u2014 \u5047\u8bbe\u524d\u9762\u90fd\u88ab\u7ed5\u8fc7\u4e86\u3002&#039;;<\/p>\n<p>\/* &#8212;- \u6e05\u7406\u6d4b\u8bd5\u8eab\u4efd\u4e0e\u8fc7\u7a0b &#8212;- *\/<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SignedRead;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SignedRead_Dyn;<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SignedRead_Dyn2;<br \/>\nDROP USER IF EXISTS u_Dyn_TestUser;<br \/>\nDROP USER IF EXISTS u_Dyn_CertReader;<br \/>\nIF EXISTS (SELECT 1 FROM sys.certificates WHERE name &#061; N&#039;Cert_Dyn_SignedReader&#039;)<br \/>\n    DROP CERTIFICATE Cert_Dyn_SignedReader;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u00b7 \u6743\u9650\u6f14\u793a\u5bf9\u8c61\u4e0e\u6d4b\u8bd5\u8eab\u4efd\u5df2\u5168\u90e8\u6e05\u7406&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6ce8\u610f&#xff1a;\u6570\u636e\u5e93\u4e3b\u5bc6\u94a5&#xff08;##MS_DatabaseMasterKey##&#xff09;\u3010\u6545\u610f\u4fdd\u7559\u3011\u2014\u2014&#039;;<br \/>\nPRINT N&#039;    \u5b83\u662f\u5e93\u7ea7\u5171\u4eab\u5bf9\u8c61&#xff0c;\u53ef\u80fd\u88ab\u5176\u5b83\u529f\u80fd\u4f9d\u8d56&#xff0c;\u4e0d\u5e94\u7531\u6f14\u793a\u811a\u672c\u968f\u610f\u5220\u9664\u3002&#039;;<br \/>\nPRINT N&#039;    \u751f\u4ea7\u4e0a\u5e94 BACKUP MASTER KEY TO FILE &#061; &#8230; ENCRYPTION BY PASSWORD &#061; &#8230;;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301007\u3011\u8ba1\u5212\u7f13\u5b58 \u2014\u2014 \u52a8\u6001 SQL \u7684\u5185\u5b58\u4ee3\u4ef7\u4e0e\u53c2\u6570\u55c5\u63a2<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   7.1  \u52a8\u6001 SQL \u7684\u8ba1\u5212\u7f13\u5b58\u673a\u5236&#xff08;\u4e3a\u4ec0\u4e48&#034;\u7f13\u5b58\u7206\u70b8&#034;\u662f\u52a8\u6001 SQL \u7684\u4e13\u5229&#xff09;<br \/>\n   7.2  \u2605 \u5b9e\u6d4b&#xff1a;\u5b57\u9762\u91cf\u62fc\u63a5 vs \u53c2\u6570\u5316\u7684\u7f13\u5b58\u6761\u76ee\u6570<br \/>\n   7.3  \u53c2\u6570\u55c5\u63a2\u5728\u52a8\u6001 SQL \u91cc\u7684\u8868\u73b0\u4e0e\u4e09\u79cd\u7f13\u89e3<br \/>\n   7.4  optimize for ad hoc workloads&#xff08;\u4e13\u95e8\u6cbb\u7f13\u5b58\u7206\u70b8&#xff09;<br \/>\n   7.5  \u7f13\u5b58\u7edf\u8ba1\u4e0e\u8bca\u65ad\u67e5\u8be2<\/p>\n<p>   \u2605 \u672c\u673a\u4e3a 32 GB \u5171\u4eab\u5185\u5b58\u73af\u5883&#xff0c;\u6545\u672c\u8282\u53ea\u505a\u3010\u5c0f\u89c4\u6a21\u3011\u7f13\u5b58\u5b9e\u9a8c&#xff0c;<br \/>\n     \u4e0d\u6267\u884c\u4efb\u4f55 DBCC FREEPROCCACHE&#xff08;\u90a3\u4f1a\u6e05\u7a7a\u5168\u5b9e\u4f8b\u8ba1\u5212\u7f13\u5b58&#xff0c;\u5f71\u54cd\u4ed6\u4eba&#xff09;\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301007\u3011\u8ba1\u5212\u7f13\u5b58\u4e0e\u53c2\u6570\u55c5\u63a2&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.1  \u673a\u5236\u8bf4\u660e<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u8ba1\u5212\u7f13\u5b58\u7684 Key \u662f\u3010\u8bed\u53e5\u6587\u672c\u7684\u54c8\u5e0c\u3011&#xff08;\u5916\u52a0 SET \u9009\u9879\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u7b49&#xff09;\u3002<br \/>\n   \u52a8\u6001 SQL \u7684\u6587\u672c\u662f\u8fd0\u884c\u671f\u62fc\u51fa\u6765\u7684\u5b57\u7b26\u4e32&#xff0c;\u6240\u4ee5&#xff1a;<br \/>\n     \u00b7 \u53ea\u8981\u62fc\u63a5\u7ed3\u679c\u6709\u4e00\u5b57\u8282\u4e0d\u540c \u2192 \u65b0 Key \u2192 \u65b0\u8ba1\u5212 \u2192 \u65b0\u7f13\u5b58\u6761\u76ee<br \/>\n     \u00b7 \u7528 sp_executesql \u628a\u53d8\u5316\u7684\u90e8\u5206\u90fd\u53c2\u6570\u5316 \u2192 \u6587\u672c\u6052\u5b9a \u2192 \u8ba1\u5212\u590d\u7528<\/p>\n<p>   \u4e00\u6761\u7ecf\u9a8c\u516c\u5f0f&#xff08;\u6e90\u81ea\u5fae\u8f6f\u987e\u95ee\u5b9e\u8df5&#xff09;&#xff1a;<br \/>\n     \u672a\u53c2\u6570\u5316\u7684 ad-hoc \u8ba1\u5212\u7ea6\u5360\u7f13\u5b58\u5185\u5b58\u7684 30%~50%&#xff0c;<br \/>\n     \u5355\u7eaf\u9760 optimize for ad hoc workloads \u5c31\u80fd\u7701\u4e0b\u5176\u4e2d\u5927\u90e8\u5206\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 7.1  \u5f53\u524d\u5b9e\u4f8b\u7684\u7f13\u5b58\u6982\u51b5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>SELECT<br \/>\n    \u7f13\u5b58\u7c7b\u578b   &#061; CASE cp.objtype<br \/>\n                    WHEN &#039;Adhoc&#039;   THEN N&#039;Adhoc&#xff08;\u52a8\u6001\/\u5185\u8054 SQL&#xff09;&#039;<br \/>\n                    WHEN &#039;Proc&#039;    THEN N&#039;Proc&#xff08;\u5b58\u50a8\u8fc7\u7a0b&#xff09;&#039;<br \/>\n                    WHEN &#039;Prepared&#039; THEN N&#039;Prepared&#xff08;\u53c2\u6570\u5316\/\u9884\u7f16\u8bd1&#xff09;&#039;<br \/>\n                    ELSE cp.objtype END,<br \/>\n    \u6761\u76ee\u6570     &#061; COUNT(*),<br \/>\n    \u5360\u7528MB     &#061; CAST(SUM(cp.size_in_bytes)\/1048576.0 AS decimal(10,2)),<br \/>\n    usecount1\u6b21 &#061; SUM(CASE WHEN cp.usecounts &#061; 1 THEN 1 ELSE 0 END)<br \/>\nFROM sys.dm_exec_cached_plans cp<br \/>\nGROUP BY cp.objtype<br \/>\nORDER BY COUNT(*) DESC;<br \/>\nPRINT N&#039;  \u2605 \u91cd\u70b9\u5173\u6ce8 Adhoc \u884c&#xff1a;\u6761\u76ee\u591a\u3001usecounts&#061;1 \u7684\u591a \u2192 \u5178\u578b\u7684\u7f13\u5b58\u7206\u70b8\u8ff9\u8c61\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.2  \u2605 \u5b9e\u6d4b&#xff1a;\u62fc\u63a5 vs \u53c2\u6570\u5316 \u7684\u7f13\u5b58\u6761\u76ee\u6570\u5dee\u5f02<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u6784\u9020 20 \u7ec4\u4e0d\u540c\u7684\u7b5b\u9009\u503c&#xff0c;\u5206\u522b\u7528\u4e24\u79cd\u65b9\u5f0f\u6267\u884c&#xff0c;\u6bd4\u8f83\u7f13\u5b58\u6761\u76ee\u3002<br \/>\n   \u2605 \u6ce8\u610f&#xff1a;\u8ba1\u5212\u7f13\u5b58\u662f\u5b9e\u4f8b\u7ea7\u5171\u4eab\u7684&#xff0c;\u91cd\u590d\u8fd0\u884c\u672c\u811a\u672c\u65f6\u6761\u76ee\u53ef\u80fd\u5df2\u5b58\u5728\u3002<br \/>\n     \u6240\u4ee5\u8fd9\u91cc\u3010\u76f4\u63a5\u7edf\u8ba1\u63a2\u9488\u6807\u8bb0\u5bf9\u5e94\u7684\u6761\u76ee\u6570\u3011&#xff0c;\u800c\u4e0d\u662f\u505a\u524d\u540e\u5dee\u503c\u76f8\u51cf \u2014\u2014<br \/>\n     \u5dee\u503c\u6cd5\u5728\u91cd\u590d\u8fd0\u884c\u65f6\u4f1a\u5f97\u5230 0 \u6216\u8d1f\u6570&#xff0c;\u662f\u5e38\u89c1\u7684\u6d4b\u91cf\u9677\u9631\u3002<br \/>\n     \u4e3a\u4e86\u5f97\u5230\u5e72\u51c0\u7684\u5bf9\u6bd4&#xff0c;\u6bcf\u6b21\u8fd0\u884c\u5148\u7528\u3010\u552f\u4e00\u6807\u8bb0\u3011\u533a\u5206\u4e24\u79cd\u65b9\u5f0f\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 7.2  \u2605 \u5b9e\u6d4b&#xff1a;20 \u7ec4\u53c2\u6570&#xff0c;\u4e24\u79cd\u65b9\u5f0f\u7684\u7f13\u5b58\u6761\u76ee \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>\/* &#8212; \u65b9\u5f0f A&#xff1a;EXEC \u62fc\u63a5&#xff08;20 \u6761\u72ec\u7acb\u8bed\u53e5&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;i int &#061; 1;<br \/>\nWHILE &#064;i &lt;&#061; 20<br \/>\nBEGIN<br \/>\n    DECLARE &#064;amt decimal(18,2) &#061; 1000.00 &#043; &#064;i * 137.5;   \/* \u6bcf\u7ec4\u90fd\u4e0d\u540c *\/<br \/>\n    DECLARE &#064;sq nvarchar(500) &#061;<br \/>\n        N&#039;SELECT \/* dyn_cache_probe_A *\/ COUNT(*) AS c FROM erp.SalesOrder &#039;<br \/>\n      &#043; N&#039;WHERE CountryCode &#061; &#039;&#039;HK&#039;&#039; AND NetAmountUsd &gt;&#061; &#039; &#043; CAST(&#064;amt AS nvarchar(30)) &#043; N&#039;;&#039;;<br \/>\n    EXEC (&#064;sq);<br \/>\n    SET &#064;i &#043;&#061; 1;<br \/>\nEND<\/p>\n<p>\/* &#8212; \u65b9\u5f0f B&#xff1a;sp_executesql \u53c2\u6570\u5316&#xff08;\u540c\u4e00\u6761\u8bed\u53e5&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;sqlB nvarchar(500) &#061;<br \/>\n    N&#039;SELECT \/* dyn_cache_probe_B *\/ COUNT(*) AS c FROM erp.SalesOrder &#039;<br \/>\n  &#043; N&#039;WHERE CountryCode &#061; &#064;cc AND NetAmountUsd &gt;&#061; &#064;amt;&#039;;<\/p>\n<p>SET &#064;i &#061; 1;<br \/>\nWHILE &#064;i &lt;&#061; 20<br \/>\nBEGIN<br \/>\n    DECLARE &#064;amtB decimal(18,2) &#061; 1000.00 &#043; &#064;i * 137.5;<br \/>\n    EXEC sys.sp_executesql &#064;sqlB, N&#039;&#064;cc char(2), &#064;amt decimal(18,2)&#039;,<br \/>\n         &#064;cc &#061; N&#039;HK&#039;, &#064;amt &#061; &#064;amtB;<br \/>\n    SET &#064;i &#043;&#061; 1;<br \/>\nEND<\/p>\n<p>\/* \u6ce8\u610f&#xff1a;A \u7684 20 \u6761\u8bed\u53e5\u5171\u4eab\u540c\u4e00\u6bb5\u524d\u7f00\u6587\u672c&#xff0c;\u4f46\u5176\u3010\u5b8c\u6574\u6587\u672c\u3011\u5404\u4e0d\u76f8\u540c&#xff0c;<br \/>\n   \u6240\u4ee5 LIKE \u5339\u914d\u5230\u7684\u662f 20 \u6761\u4e0d\u540c\u7684\u7f13\u5b58\u6761\u76ee\u3002<br \/>\n   B \u7684\u5b8c\u6574\u6587\u672c\u6052\u5b9a&#xff0c;\u6240\u4ee5\u53ea\u5339\u914d\u5230 1 \u6761\u3002 *\/<br \/>\nDECLARE &#064;cntA int &#061;<br \/>\n    (SELECT COUNT(*) FROM sys.dm_exec_cached_plans cp<br \/>\n     CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\n     WHERE t.text LIKE N&#039;%dyn_cache_probe_A%&#039;);<br \/>\nDECLARE &#064;cntB int &#061;<br \/>\n    (SELECT COUNT(*) FROM sys.dm_exec_cached_plans cp<br \/>\n     CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\n     WHERE t.text LIKE N&#039;%dyn_cache_probe_B%&#039;);<\/p>\n<p>SELECT<br \/>\n    \u65b9\u5f0f             &#061; \u65b9\u5f0f,<br \/>\n    \u6267\u884c\u6b21\u6570         &#061; 20,<br \/>\n    \u7f13\u5b58\u6761\u76ee\u6570       &#061; \u6761\u76ee\u6570,<br \/>\n    \u5e73\u5747\u590d\u7528\u6b21\u6570     &#061; CAST(20.0 \/ NULLIF(\u6761\u76ee\u6570, 0) AS decimal(10,2)),<br \/>\n    \u7ed3\u8bba             &#061; \u7ed3\u8bba<br \/>\nFROM (VALUES<br \/>\n    (N&#039;EXEC \u62fc\u63a5&#xff08;\u5b57\u9762\u91cf&#xff09;&#039;,   &#064;cntA, N&#039;\u2717 \u6bcf\u6761\u90fd\u662f\u65b0\u8bed\u53e5&#xff0c;20 \u7ec4\u53c2\u6570 &#061; 20 \u4efd\u8ba1\u5212&#039;),<br \/>\n    (N&#039;sp_executesql \u53c2\u6570\u5316&#039;,  &#064;cntB, N&#039;\u2713 \u540c\u4e00\u6761\u6587\u672c&#xff0c;20 \u6b21\u5171\u7528 1 \u4efd\u8ba1\u5212&#039;)<br \/>\n) v(\u65b9\u5f0f, \u6761\u76ee\u6570, \u7ed3\u8bba);<br \/>\nPRINT N&#039;  \u2605 \u5bf9\u6bd4\u8981\u70b9&#xff1a;\u540c\u6837\u7684\u4e1a\u52a1\u903b\u8f91\u3001\u540c\u6837\u7684 20 \u6b21\u6267\u884c&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u52a8\u6001 SQL \u7684\u8ba1\u5212\u6761\u76ee\u6570\u53ef\u80fd\u76f8\u5dee 20 \u500d\u3002&#039;;<br \/>\nPRINT N&#039;    \u4e07\u4ebf\u7ea7\u9ad8\u5e76\u53d1\u4e0b&#xff0c;\u8fd9\u5c31\u662f\u8ba1\u5212\u7f13\u5b58\u5185\u5b58\u96ea\u5d29\u7684\u8d77\u70b9\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6d4b\u91cf\u65b9\u6cd5\u63d0\u9192&#xff1a;\u4e0d\u8981\u7528&#034;\u6267\u884c\u524d\u540e\u6761\u76ee\u6570\u76f8\u51cf&#034;\u6765\u5ea6\u91cf\u7f13\u5b58\u589e\u957f \u2014\u2014&#039;;<br \/>\nPRINT N&#039;    \u5728\u91cd\u590d\u8fd0\u884c\u65f6\u90a3\u4e9b\u6761\u76ee\u5df2\u5b58\u5728&#xff0c;\u5dee\u503c\u4f1a\u662f 0 \u751a\u81f3\u8d1f\u6570\u3002&#039;;<br \/>\nPRINT N&#039;    \u6b63\u786e\u505a\u6cd5\u662f\u7ed9\u63a2\u9488\u6253\u3010\u552f\u4e00\u6807\u8bb0\u3011\u5e76\u76f4\u63a5\u7edf\u8ba1\u5339\u914d\u6761\u76ee\u6570\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.3  \u2605 \u53c2\u6570\u55c5\u63a2&#xff08;Parameter Sniffing&#xff09;\u5728\u52a8\u6001 SQL \u91cc\u7684\u8868\u73b0<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u53c2\u6570\u5316\u540e&#xff0c;SQL Server \u4f1a\u7528\u3010\u9996\u6b21\u6267\u884c\u7684\u53c2\u6570\u503c\u3011\u6765\u4f30\u8ba1\u884c\u6570\u3001\u751f\u6210\u8ba1\u5212\u3002<br \/>\n   \u5982\u679c\u6570\u636e\u5206\u5e03\u6781\u4e0d\u5747\u5300&#xff0c;\u9996\u6b21\u53c2\u6570\u662f&#034;\u975e\u5178\u578b\u503c&#034;&#xff0c;\u540e\u7eed\u6267\u884c\u5c31\u4f1a\u8dd1\u5dee\u8ba1\u5212\u3002<br \/>\n   \u52a8\u6001 SQL \u56e0\u4e3a\u540c\u6837\u8d70 sp_executesql&#xff0c;\u8fd9\u4e2a\u95ee\u9898\u3010\u5b8c\u5168\u4e00\u6837\u5b58\u5728\u3011\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 7.3  \u2605 \u53c2\u6570\u55c5\u63a2&#xff1a;\u5217\u503c\u5206\u5e03\u6781\u4e0d\u5747\u5300\u65f6\u7684\u8ba1\u5212\u5dee\u5f02 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u672c\u5e93 erp.SalesOrder \u7684\u56fd\u5bb6\u5206\u5e03&#xff1a;&#039;;<br \/>\nSELECT \u56fd\u5bb6 &#061; CountryCode, \u8ba2\u5355\u6570 &#061; COUNT(*), \u5360\u6bd4 &#061;<br \/>\n       CAST(100.0 * COUNT(*) \/ SUM(COUNT(*)) OVER () AS decimal(5,2))<br \/>\nFROM erp.SalesOrder GROUP BY CountryCode ORDER BY COUNT(*) DESC;<br \/>\nPRINT N&#039;  \u2605 CN \u4e0e HK \u5404 1200 \u884c&#xff0c;\u5176\u4f59\u5404\u56fd 720 \u884c \u2014\u2014 \u5206\u5e03\u76f8\u5bf9\u5747\u8861&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u4f46\u771f\u5b9e\u573a\u666f\u91cc&#034;\u5927\u5ba2\u6237 vs \u957f\u5c3e\u5ba2\u6237&#034;\u5f80\u5f80\u5dee 1000 \u500d\u4ee5\u4e0a\u3002&#039;;<br \/>\nPRINT N&#039;    \u8fd9\u91cc\u7528\u4e00\u4e2a\u3010\u4eba\u4e3a\u6784\u9020\u3011\u7684\u503e\u659c\u5217\u6765\u6f14\u793a\u55c5\u63a2\u6548\u5e94\u3002&#039;;<\/p>\n<p>\/* \u6784\u9020\u503e\u659c\u6570\u636e&#xff1a;VIP \u5ba2\u6237\u8ba2\u5355\u6781\u5c11&#xff0c;Standard \u5ba2\u6237\u8ba2\u5355\u6781\u591a *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u6784\u9020\u503e\u659c\u8868 dbo.Dyn_SkewDemo \u5e76\u89c2\u5bdf\u4e24\u5957\u8ba1\u5212&#xff1a;&#039;;<br \/>\nGO<br \/>\nCREATE OR ALTER PROCEDURE dbo.usp_Dyn_SniffDemo<br \/>\n    &#064;Tier varchar(10)<br \/>\nAS<br \/>\nBEGIN<br \/>\n    SET NOCOUNT ON;<br \/>\n    \/* \u7528\u5ba2\u6237\u7b49\u7ea7\u505a\u8fc7\u6ee4&#xff0c;\u5206\u5e03\u6781\u4e0d\u5747\u5300 *\/<br \/>\n    SELECT COUNT(*) AS \u8ba2\u5355\u6570<br \/>\n    FROM   erp.SalesOrder so<br \/>\n    JOIN   crm.Customer c ON c.CustomerId &#061; so.CustomerId<br \/>\n    WHERE  c.Tier &#061; &#064;Tier;<br \/>\nEND<br \/>\nGO<\/p>\n<p>PRINT N&#039;    \u9996\u6b21\u6267\u884c&#xff08;\u4f20\u5165\u9ad8\u9891\u503c Standard&#xff09;&#xff1a;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SniffDemo &#064;Tier &#061; N&#039;Standard&#039;;<br \/>\nPRINT N&#039;    \u518d\u6b21\u6267\u884c&#xff08;\u4f20\u5165\u4f4e\u9891\u503c VIP&#xff09;&#xff1a;&#039;;<br \/>\nEXEC dbo.usp_Dyn_SniffDemo &#064;Tier &#061; N&#039;VIP&#039;;<br \/>\nPRINT N&#039;    \u2605 \u7b2c\u4e8c\u6b21\u7528\u7684\u4ecd\u662f\u7b2c\u4e00\u6b21\u751f\u6210\u7684\u8ba1\u5212&#xff08;\u6309 Standard \u4f30\u8ba1\u884c\u6570&#xff09;&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u82e5 VIP \u9700\u8981\u5b8c\u5168\u4e0d\u540c\u7684\u8bbf\u95ee\u8def\u5f84&#xff08;\u5982\u7d22\u5f15 Seek vs \u626b\u63cf&#xff09;&#xff0c;\u5c31\u4f1a\u53d8\u6162\u3002&#039;;<br \/>\nPRINT N&#039;    \u2605 \u53ef\u8c03\u4f18\u624b\u6bb5&#xff08;\u6309\u63a8\u8350\u987a\u5e8f&#xff09;&#xff1a;&#039;;<br \/>\nSELECT<br \/>\n    \u624b\u6bb5 &#061; \u624b\u6bb5, \u505a\u6cd5 &#061; \u505a\u6cd5, \u4ee3\u4ef7 &#061; \u4ee3\u4ef7<br \/>\nFROM (VALUES<br \/>\n    (N&#039;1. \u8ba9\u8ba1\u5212\u4e0e\u53c2\u6570\u65e0\u5173&#039;, N&#039;\u6539\u5199 SQL \u8ba9\u4f18\u5316\u5668\u4e0d\u90a3\u4e48\u4f9d\u8d56\u9996\u6b21\u503c&#xff08;\u5982\u52a0 OPTION(RECOMPILE) \u5230\u5173\u952e\u8bed\u53e5&#xff09;&#039;, N&#039;\u6bcf\u6b21\u7f16\u8bd1&#xff0c;CPU \u7565\u589e&#039;),<br \/>\n    (N&#039;2. OPTION(RECOMPILE)&#039;, N&#039;\u6bcf\u6b21\u6267\u884c\u90fd\u91cd\u65b0\u7f16\u8bd1 \u2192 \u6bcf\u6b21\u90fd\u6309\u5f53\u524d\u53c2\u6570\u6700\u4f18&#039;, N&#039;\u7f16\u8bd1\u5f00\u9500&#xff0c;\u9ad8\u5e76\u53d1\u4e0b\u614e\u7528&#039;),<br \/>\n    (N&#039;3. OPTIMIZE FOR UNKNOWN&#039;, N&#039;\u6309\u5e73\u5747\u5206\u5e03\u4f30\u8ba1&#xff0c;\u4e0d\u504f\u5411\u4efb\u4f55\u53c2\u6570\u503c&#039;, N&#039;\u53ef\u80fd\u5bf9\u5178\u578b\u503c\u53cd\u800c\u4e0d\u4f18&#039;),<br \/>\n    (N&#039;4. OPTIMIZE FOR (&#064;p &#061; &#039;&#039;x&#039;&#039;)&#039;, N&#039;\u6309\u6307\u5b9a&#034;\u5178\u578b\u503c&#034;\u4f30\u8ba1&#xff0c;\u9002\u5408\u5df2\u77e5\u7684\u9ad8\u9891\u503c&#039;, N&#039;\u9700\u4eba\u5de5\u5224\u65ad\u5178\u578b\u503c&#039;),<br \/>\n    (N&#039;5. \u62c6\u5206\u4e3a\u591a\u4e2a\u8fc7\u7a0b&#039;, N&#039;\u6309\u53c2\u6570\u8303\u56f4\u5206\u6d3e\u5230\u4e0d\u540c\u8fc7\u7a0b&#xff08;IF &#064;p IN (\u9ad8\u9891) EXEC proc1 ELSE EXEC proc2&#xff09;&#039;, N&#039;\u4ee3\u7801\u91cd\u590d&#xff0c;\u4f46\u8ba1\u5212\u6700\u7a33&#039;)<br \/>\n) v(\u624b\u6bb5, \u505a\u6cd5, \u4ee3\u4ef7);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.4  optimize for ad hoc workloads \u2014\u2014 \u6cbb\u7f13\u5b58\u7206\u70b8\u7684\u5f00\u5173<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 7.4  optimize for ad hoc workloads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u914d\u7f6e\u9879 &#061; N&#039;optimize for ad hoc workloads&#039;,<br \/>\n    \u5f53\u524d\u503c &#061; CAST(value_in_use AS nvarchar(5)),<br \/>\n    \u8bf4\u660e   &#061; CASE WHEN value_in_use &#061; 1<br \/>\n                 THEN N&#039;\u5df2\u5f00\u542f&#xff1a;\u9996\u6b21\u6267\u884c\u7684 ad-hoc \u8ba1\u5212\u53ea\u5b58&#034;\u5b58\u6839&#034;&#xff0c;\u7b2c\u4e8c\u6b21\u624d\u5b58\u5b8c\u6574\u8ba1\u5212&#039;<br \/>\n                 ELSE N&#039;\u672a\u5f00\u542f&#xff1a;\u6240\u6709 ad-hoc \u8ba1\u5212\u90fd\u5b8c\u6574\u5165\u7f13\u5b58&#xff08;\u672c\u673a\u73b0\u72b6&#xff09;&#039; END<br \/>\nFROM sys.configurations WHERE name &#061; &#039;optimize for ad hoc workloads&#039;;<\/p>\n<p>PRINT N&#039;  \u2605 \u5f00\u542f\u65b9\u5f0f&#xff08;\u9700 sysadmin \/ server \u7ea7\u6743\u9650&#xff09;&#xff1a;&#039;;<br \/>\nPRINT N&#039;      EXEC sys.sp_configure N&#039;&#039;optimize for ad hoc workloads&#039;&#039;, 1;&#039;;<br \/>\nPRINT N&#039;      RECONFIGURE;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6548\u679c&#xff1a;\u53ea\u6267\u884c\u4e00\u6b21\u7684 ad-hoc \u8bed\u53e5\u4e0d\u518d\u5360\u7528\u5b8c\u6574\u8ba1\u5212\u5185\u5b58&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u901a\u5e38\u53ef\u91ca\u653e 20%~40% \u7684\u8ba1\u5212\u7f13\u5b58\u5185\u5b58\u3002\u5bf9\u52a8\u6001 SQL \u5bc6\u96c6\u7684\u7cfb\u7edf&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u8fd9\u662f\u3010\u6027\u4ef7\u6bd4\u6700\u9ad8\u7684\u4e00\u4e2a\u5f00\u5173\u3011\u3002\u672c\u811a\u672c\u4e0d\u4fee\u6539\u670d\u52a1\u5668\u914d\u7f6e\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.5  \u7f13\u5b58\u8bca\u65ad\u67e5\u8be2&#xff08;\u53ef\u76f4\u63a5\u7528\u4e8e\u751f\u4ea7\u5de1\u68c0&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 7.5  \u7f13\u5b58\u8bca\u65ad&#xff1a;\u5360\u5185\u5b58\u6700\u591a\u7684\u524d 10 \u7c7b\u52a8\u6001\u8bed\u53e5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT TOP 10<br \/>\n    \u8bed\u53e5\u6458\u8981   &#061; LEFT(REPLACE(REPLACE(t.text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), 60),<br \/>\n    \u6761\u76ee\u6570     &#061; COUNT(*),<br \/>\n    \u603b\u5360\u7528KB   &#061; SUM(cp.size_in_bytes) \/ 1024,<br \/>\n    \u603b\u6267\u884c\u6b21\u6570 &#061; SUM(cp.usecounts),<br \/>\n    \u5e73\u5747\u6210\u672c   &#061; CAST(SUM(qs.total_worker_time) \/ NULLIF(SUM(qs.execution_count), 0) \/ 1000.0<br \/>\n                      AS decimal(18,2))<br \/>\nFROM sys.dm_exec_cached_plans cp<br \/>\nCROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\nLEFT JOIN sys.dm_exec_query_stats qs ON qs.plan_handle &#061; cp.plan_handle<br \/>\nWHERE t.text LIKE N&#039;%erp.%&#039; OR t.text LIKE N&#039;%crm.%&#039;<br \/>\nGROUP BY LEFT(REPLACE(REPLACE(t.text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), 60)<br \/>\nORDER BY SUM(cp.size_in_bytes) DESC;<br \/>\nPRINT N&#039;  \u2605 \u5de1\u68c0\u8981\u70b9&#xff1a;\u6761\u76ee\u6570\u5f88\u591a\u4f46&#034;\u603b\u6267\u884c\u6b21\u6570\/\u6761\u76ee\u6570&#034;\u63a5\u8fd1 1 \u2192 \u53c2\u6570\u5316\u4e0d\u5230\u4f4d\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   7.6  \u2605 \u91cd\u8981\u63d0\u9192&#xff1a;\u672c\u811a\u672c\u4e0d\u6267\u884c DBCC FREEPROCCACHE<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u5f88\u591a\u793a\u4f8b\u811a\u672c\u4f1a\u7528 DBCC FREEPROCCACHE \u6765&#034;\u91cd\u7f6e&#034;\u7f13\u5b58\u4ee5\u4fbf\u6d4b\u91cf\u3002<br \/>\n   \u4f46\u5728\u5171\u4eab\u5b9e\u4f8b\u4e0a&#xff0c;\u8fd9\u4f1a&#xff1a;<br \/>\n     \u00b7 \u6e05\u7a7a\u3010\u6240\u6709\u6570\u636e\u5e93\u3011\u7684\u8ba1\u5212\u7f13\u5b58&#xff0c;\u5bfc\u81f4\u5168\u5b9e\u4f8b\u8ba1\u5212\u91cd\u65b0\u7f16\u8bd1&#xff0c;CPU \u98d9\u5347<br \/>\n     \u00b7 \u4e0e\u672c\u673a&#034;\u53ef\u7528\u5185\u5b58\u4ec5\u6570 GB&#034;\u7684\u73af\u5883\u53e0\u52a0&#xff0c;\u53ef\u80fd\u89e6\u53d1 701 \u5185\u5b58\u4e0d\u8db3<br \/>\n   \u6240\u4ee5\u672c\u811a\u672c\u4e00\u5f8b\u7528\u3010LIKE \u9650\u5b9a\u6587\u672c\u3011\u7684\u65b9\u5f0f\u6765\u7edf\u8ba1\u7279\u5b9a\u8bed\u53e5\u7684\u6761\u76ee&#xff0c;<br \/>\n   \u800c\u4e0d\u662f\u6e05\u7a7a\u6574\u4e2a\u7f13\u5b58\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u672c\u811a\u672c\u523b\u610f\u3010\u672a\u6267\u884c\u3011DBCC FREEPROCCACHE \u2014\u2014 \u5171\u4eab\u5b9e\u4f8b\u4e0a\u5b83\u4f1a\u62d6\u57ae\u5168\u4f53\u3002&#039;;<br \/>\nPRINT N&#039;    \u5982\u9700\u6e05\u7406\u5355\u4e2a\u8ba1\u5212&#xff0c;\u6b63\u786e\u505a\u6cd5&#xff1a;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u6e05\u7a7a\u5168\u90e8&#xff1a;  DBCC FREEPROCCACHE;                  &#xff08;\u5371\u9669&#xff0c;\u5168\u5b9e\u4f8b\u91cd\u7f16\u8bd1&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u6309\u53e5\u67c4&#xff1a;    DBCC FREEPROCCACHE (&#064;plan_handle);    &#xff08;\u7cbe\u786e&#xff0c;\u63a8\u8350&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u6309\u8d44\u6e90\u6c60&#xff1a;  DBCC FREEPROCCACHE (&#039;&#039;default&#039;&#039;);      &#xff08;\u8f83\u6e29\u548c&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u6e05\u5e93\u7ea7&#xff1a;    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;&#039;;<\/p>\n<p>\/* &#8212;- \u6e05\u7406\u6f14\u793a\u8fc7\u7a0b &#8212;- *\/<br \/>\nDROP PROCEDURE IF EXISTS dbo.usp_Dyn_SniffDemo;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301008\u3011\u4e07\u4ebf\u7ea7\u6570\u636e &#043; \u9ad8\u5e76\u53d1\u4e0b\u7684\u52a8\u6001 SQL \u7b56\u7565<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u6570\u636e\u91cf\u5230\u4e07\u4ebf\u884c\u3001\u5e76\u53d1\u5230\u6570\u5343\u65f6&#xff0c;\u52a8\u6001 SQL \u9762\u4e34\u56db\u4e2a\u65b0\u95ee\u9898&#xff1a;<br \/>\n     8.1  \u6df1\u5206\u9875&#xff08;OFFSET \u8d8a\u5927\u8d8a\u6162&#xff09;\u2192 \u952e\u96c6\u5206\u9875&#xff08;Keyset Pagination&#xff09;<br \/>\n     8.2  \u5206\u533a\u88c1\u526a \u2192 \u52a8\u6001 SQL \u5fc5\u987b\u628a\u5206\u533a\u952e\u62fc\u8fdb\u8c13\u8bcd&#xff08;\u503c\u4ecd\u53c2\u6570\u5316&#xff09;<br \/>\n     8.3  \u8ba1\u5212\u5f3a\u5236&#xff08;Query Store Plan Forcing&#xff09;\u4e0e\u52a8\u6001 SQL \u7684\u914d\u5408<br \/>\n     8.4  \u9ad8\u5e76\u53d1\u4e0b\u7684\u53c2\u6570\u55c5\u63a2\u653e\u5927\u6548\u5e94<br \/>\n     8.5  \u5e76\u53d1\u4e0e\u5185\u5b58&#xff1a;\u52a8\u6001 SQL \u7684\u7f13\u5b58\u9884\u7b97\u4f30\u7b97<\/p>\n<p>   \u2605 \u672c\u673a rpt.OrgSalesFact \u662f 500 \u4e07\u884c\u7684\u805a\u96c6\u5217\u5b58\u8868&#xff08;CCI&#xff09;&#xff0c;<br \/>\n     \u4e3a 32 GB \u5171\u4eab\u5185\u5b58\u73af\u5883\u8ba1&#xff0c;\u672c\u8282\u6240\u6709\u67e5\u8be2\u90fd\u9650\u5b9a\u5728\u3010\u5355\u6708\/\u5355\u5e97\u3011\u8303\u56f4\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301008\u3011\u4e07\u4ebf\u7ea7\u6570\u636e &#043; \u9ad8\u5e76\u53d1\u4e0b\u7684\u52a8\u6001 SQL \u7b56\u7565&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   8.1  \u6df1\u5206\u9875&#xff1a;OFFSET\/FETCH \u7684\u7ebf\u6027\u4ee3\u4ef7<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   OFFSET 1000000 ROWS FETCH NEXT 20 \u7684\u542b\u4e49\u662f&#xff1a;<br \/>\n     \u5148\u53d6\u51fa 1000020 \u884c\u3001\u4e22\u6389\u524d 1000000 \u884c\u3001\u53ea\u8fd4\u56de 20 \u884c\u3002<br \/>\n   \u6240\u4ee5\u9875\u7801\u8d8a\u6df1\u8d8a\u6162&#xff0c;\u662f O(offset) \u800c\u4e0d\u662f O(1)\u3002<\/p>\n<p>   \u5bf9\u6bd4\u4e24\u79cd\u5206\u9875&#xff1a;<br \/>\n     \u2460 OFFSET\/FETCH  \u2014\u2014 \u5b9e\u73b0\u7b80\u5355&#xff0c;\u6df1\u7ffb\u9875\u52a3\u5316\u4e25\u91cd&#xff0c;\u4e0d\u9002\u5408\u4e07\u4ebf\u7ea7<br \/>\n     \u2461 \u952e\u96c6\u5206\u9875       \u2014\u2014 \u7528&#034;\u4e0a\u4e00\u9875\u6700\u540e\u4e00\u884c\u7684\u952e&#034;\u505a Seek&#xff0c;\u6052\u5b9a\u6210\u672c<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 8.1  \u6df1\u5206\u9875 vs \u952e\u96c6\u5206\u9875 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>\/* &#8212; \u65b9\u5f0f\u2460&#xff1a;OFFSET\/FETCH&#xff08;\u6d45\u9875\u4e0e\u6df1\u9875\u5bf9\u6bd4&#xff09;&#8212; *\/<br \/>\nPRINT N&#039;  \u25b8 \u65b9\u5f0f\u2460 OFFSET\/FETCH&#xff1a;\u6d45\u9875&#xff08;\u7b2c 1 \u9875&#xff09;&#039;;<br \/>\nSET STATISTICS IO OFF;<br \/>\nDECLARE &#064;t1 datetime2(7) &#061; SYSDATETIME();<br \/>\nDECLARE &#064;pg int &#061; 1;<br \/>\nSELECT OrderNo, OrderDate, NetAmountUsd<br \/>\nFROM   erp.SalesOrder<br \/>\nORDER BY OrderId<br \/>\nOFFSET (&#064;pg &#8211; 1) * 20 ROWS FETCH NEXT 20 ROWS ONLY;<br \/>\nSELECT \u9875 &#061; N&#039;\u7b2c 1 \u9875&#xff08;OFFSET 0&#xff09;&#039;,<br \/>\n       \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t1, SYSDATETIME());<\/p>\n<p>PRINT N&#039;  \u25b8 \u65b9\u5f0f\u2460 OFFSET\/FETCH&#xff1a;\u6df1\u9875&#xff08;\u7b2c 100 \u9875&#xff0c;OFFSET 1980&#xff09;&#039;;<br \/>\nDECLARE &#064;t2 datetime2(7) &#061; SYSDATETIME();<br \/>\nSET &#064;pg &#061; 100;<br \/>\nSELECT OrderNo, OrderDate, NetAmountUsd<br \/>\nFROM   erp.SalesOrder<br \/>\nORDER BY OrderId<br \/>\nOFFSET (&#064;pg &#8211; 1) * 20 ROWS FETCH NEXT 20 ROWS ONLY;<br \/>\nSELECT \u9875 &#061; N&#039;\u7b2c 100 \u9875&#xff08;OFFSET 1980&#xff09;&#039;,<br \/>\n       \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t2, SYSDATETIME());<br \/>\nPRINT N&#039;  \u2605 \u672c\u8868\u53ea\u6709 6000 \u884c&#xff0c;\u5dee\u5f02\u4e0d\u660e\u663e&#xff1b;\u4f46\u6362\u6210\u4e07\u4ebf\u884c&#xff0c;&#039;;<br \/>\nPRINT N&#039;    OFFSET \u8d8a\u5927\u4ee3\u4ef7\u7ebf\u6027\u589e\u957f \u2014\u2014 \u7b2c 100 \u4e07\u9875\u4f1a\u8bfb\u5230 2000 \u4e07\u884c\u518d\u4e22\u6389\u3002&#039;;<\/p>\n<p>\/* &#8212; \u65b9\u5f0f\u2461&#xff1a;\u952e\u96c6\u5206\u9875&#xff08;\u6052\u5b9a\u6210\u672c&#xff09;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u65b9\u5f0f\u2461 \u952e\u96c6\u5206\u9875&#xff08;Keyset \/ Seek \u5206\u9875&#xff09;\u2014\u2014 \u6052\u5b9a\u6210\u672c&#039;;<br \/>\nDECLARE &#064;lastOrderId bigint &#061; 0;      \/* \u4e0a\u4e00\u9875\u6700\u540e\u4e00\u884c\u7684\u952e *\/<br \/>\nDECLARE &#064;pageSize int &#061; 20;<\/p>\n<p>DECLARE &#064;t3 datetime2(7) &#061; SYSDATETIME();<br \/>\nSELECT TOP (&#064;pageSize) OrderNo, OrderDate, NetAmountUsd, OrderId<br \/>\nFROM   erp.SalesOrder<br \/>\nWHERE  OrderId &gt; &#064;lastOrderId          \/* \u2605 \u5173\u952e&#xff1a;Seek&#xff0c;\u4e0d\u662f Skip *\/<br \/>\nORDER BY OrderId;<br \/>\nSELECT \u9875 &#061; N&#039;\u7b2c 1 \u9875&#xff08;\u952e\u96c6&#xff0c;OrderId &gt; 0&#xff09;&#039;,<br \/>\n       \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t3, SYSDATETIME());<\/p>\n<p>SET &#064;lastOrderId &#061; 2000;<br \/>\nDECLARE &#064;t4 datetime2(7) &#061; SYSDATETIME();<br \/>\nSELECT TOP (&#064;pageSize) OrderNo, OrderDate, NetAmountUsd, OrderId<br \/>\nFROM   erp.SalesOrder<br \/>\nWHERE  OrderId &gt; &#064;lastOrderId<br \/>\nORDER BY OrderId;<br \/>\nSELECT \u9875 &#061; N&#039;\u7b2c 100 \u9875\u7b49\u6548&#xff08;\u952e\u96c6&#xff0c;OrderId &gt; 2000&#xff09;&#039;,<br \/>\n       \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t4, SYSDATETIME());<br \/>\nPRINT N&#039;  \u2605 \u5173\u952e\u5dee\u5f02&#xff1a;\u952e\u96c6\u5206\u9875\u7684\u4ee3\u4ef7\u3010\u4e0e\u9875\u7801\u65e0\u5173\u3011\u2014\u2014 \u6c38\u8fdc\u662f\u4e00\u6b21\u7d22\u5f15 Seek&#039;;<br \/>\nPRINT N&#039;    &#043; \u53d6 20 \u884c\u3002\u8fd9\u5c31\u662f\u4e07\u4ebf\u7ea7\u5206\u9875\u7684\u552f\u4e00\u6b63\u786e\u59ff\u52bf\u3002&#039;;<\/p>\n<p>\/* &#8212; \u952e\u96c6\u5206\u9875\u7684\u6ce8\u610f\u4e8b\u9879 &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u952e\u96c6\u5206\u9875\u7684\u56db\u4e2a\u524d\u63d0 \/ \u9650\u5236&#xff1a;&#039;;<br \/>\nSELECT \u8981\u70b9 &#061; \u8981\u70b9, \u8bf4\u660e &#061; \u8bf4\u660e<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u6392\u5e8f\u952e\u5fc5\u987b\u552f\u4e00\u4e14\u6709\u5e8f&#039;, N&#039;\u7528\u4e3b\u952e\u6216\u552f\u4e00\u952e&#xff1b;\u82e5\u6309\u975e\u552f\u4e00\u5217\u6392\u5e8f&#xff0c;\u9700\u52a0 PK \u4f5c\u4e3a tie-breaker&#xff0c;\u5982 (SortCol, OrderId)&#039;),<br \/>\n    (N&#039;\u4e0d\u80fd\u76f4\u63a5\u8df3\u9875&#039;,         N&#039;\u53ea\u80fd&#034;\u4e0b\u4e00\u9875\/\u4e0a\u4e00\u9875&#034;&#xff0c;\u65e0\u6cd5\u8df3\u5230\u7b2c 1000 \u9875&#xff08;\u8fd9\u662f\u53ef\u63a5\u53d7\u7684\u4ee3\u4ef7&#xff09;&#039;),<br \/>\n    (N&#039;\u6392\u5e8f\u952e\u4e0d\u80fd\u53d8&#039;,         N&#039;\u5206\u9875\u8fc7\u7a0b\u4e2d\u6570\u636e\u88ab\u6539\u4f1a\u5bfc\u81f4\u8df3\u884c\u6216\u91cd\u590d&#xff0c;\u9700\u4e1a\u52a1\u4e0a\u53ef\u63a5\u53d7&#039;),<br \/>\n    (N&#039;WHERE \u8981\u80fd Seek&#039;,      N&#039;\u6392\u5e8f\u5217\u4e0a\u6709\u7d22\u5f15\u624d\u6709\u6548&#xff1b;\u672c\u4f8b OrderId \u662f\u805a\u96c6\u4e3b\u952e&#xff0c;\u5929\u7136\u6709\u5e8f&#039;)<br \/>\n) v(\u8981\u70b9, \u8bf4\u660e);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   8.2  \u5206\u533a\u88c1\u526a&#xff1a;\u52a8\u6001 SQL \u5fc5\u987b\u628a\u5206\u533a\u952e\u62fc\u8fdb\u8c13\u8bcd<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   \u4e07\u4ebf\u884c\u8868\u901a\u5e38\u6309\u6708\/\u5e74\u5206\u533a&#xff08;\u6216\u6309\u65e5\u671f\u505a\u5217\u5b58 row group \u6d88\u9664&#xff09;\u3002<br \/>\n   \u5206\u533a\u88c1\u526a&#xff08;Partition Elimination&#xff09;\u8981\u6c42\u3010\u7f16\u8bd1\u671f\u3011\u5c31\u80fd\u770b\u5230\u5206\u533a\u952e\u7684\u5e38\u91cf\u8303\u56f4\u3002<br \/>\n   \u5982\u679c\u628a\u65e5\u671f\u53c2\u6570\u5316\u6210\u4e00\u4e2a\u53d8\u91cf&#xff0c;\u4f18\u5316\u5668\u65e0\u6cd5\u88c1\u526a \u2192 \u5168\u8868\u626b\u63cf\u3002<\/p>\n<p>   \u2605 \u8fd9\u662f\u4e00\u4e2a&#034;\u53c2\u6570\u5316&#034;\u4e0e&#034;\u5206\u533a\u88c1\u526a&#034;\u7684\u7ecf\u5178\u51b2\u7a81&#xff1a;<br \/>\n     \u503c\u53c2\u6570\u5316 \u2192 \u8ba1\u5212\u590d\u7528&#xff0c;\u4f46\u5931\u53bb\u5206\u533a\u88c1\u526a<br \/>\n     \u503c\u62fc\u5b57\u9762\u91cf \u2192 \u53ef\u4ee5\u88c1\u526a&#xff0c;\u4f46\u8ba1\u5212\u65e0\u6cd5\u590d\u7528&#xff08;\u4e14\u8981\u9632\u6ce8\u5165&#xff09;<br \/>\n     \u89e3\u6cd5&#xff1a;\u5bf9\u5206\u533a\u952e\u7528\u3010\u53d7\u63a7\u7684\u5b57\u9762\u91cf\u62fc\u63a5\u3011&#xff08;\u503c\u7ecf\u8fc7\u4e25\u683c\u6821\u9a8c &#043; \u767d\u540d\u5355&#xff09;&#xff0c;<br \/>\n           \u5bf9\u5176\u5b83\u8c13\u8bcd\u7ee7\u7eed\u53c2\u6570\u5316\u3002<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 8.2  \u5206\u533a\u88c1\u526a\u4e0e\u53c2\u6570\u5316\u7684\u51b2\u7a81 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>PRINT N&#039;  \u672c\u8868 rpt.OrgSalesFact \u7684\u89c4\u6a21\u4e0e\u7d22\u5f15\u60c5\u51b5&#xff1a;&#039;;<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u771f\u5b9e\u884c\u6570&#xff08;row group \u5143\u6570\u636e&#xff09;&#039;,<br \/>\n    \u503c   &#061; CAST((SELECT SUM(total_rows)<br \/>\n                 FROM sys.dm_db_column_store_row_group_physical_stats<br \/>\n                 WHERE object_id &#061; OBJECT_ID(&#039;rpt.OrgSalesFact&#039;)) AS nvarchar(30));<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;\u7d22\u5f15\u7c7b\u578b&#039;,<br \/>\n    \/* \u2605 \u5751&#xff1a;sys \u76ee\u5f55\u89c6\u56fe\u7684\u5217\u7528\u3010\u76ee\u5f55\u6392\u5e8f\u89c4\u5219\u3011&#xff0c;\u4e0e\u5e93\u6392\u5e8f\u89c4\u5219\u62fc\u63a5\u4f1a\u62a5 451\u3002<br \/>\n       \u51e1\u662f\u8981\u628a\u7cfb\u7edf\u5217\u4e0e\u81ea\u5df1\u7684\u4e2d\u6587\u5b57\u9762\u91cf\u62fc\u63a5&#xff0c;\u90fd\u8981\u52a0 COLLATE DATABASE_DEFAULT\u3002*\/<br \/>\n    \u503c   &#061; i.type_desc COLLATE DATABASE_DEFAULT &#043; N&#039; \/ &#039;<br \/>\n         &#043; ISNULL(i.name COLLATE DATABASE_DEFAULT, N&#039;(\u65e0)&#039;)<br \/>\nFROM sys.indexes i<br \/>\nWHERE i.object_id &#061; OBJECT_ID(&#039;rpt.OrgSalesFact&#039;);<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u5bf9\u7167\u5b9e\u9a8c&#xff1a;\u65e5\u671f\u3010\u53c2\u6570\u5316\u3011 vs \u65e5\u671f\u3010\u53d7\u63a7\u62fc\u63a5\u3011&#039;;<br \/>\nPRINT N&#039;    &#xff08;\u4e24\u8005\u903b\u8f91\u7b49\u4ef7&#xff0c;\u6bd4\u8f83\u6267\u884c\u8ba1\u5212\u4e2d\u7684\u5206\u533a\/row group \u6d88\u9664\u60c5\u51b5&#xff09;&#039;;<\/p>\n<p>\/* &#8212; \u53c2\u6570\u5316\u7248\u672c&#xff08;\u4f18\u5316\u5668\u770b\u4e0d\u5230\u5e38\u91cf\u8303\u56f4&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;dtFrom date &#061; &#039;2025-03-01&#039;, &#064;dtTo date &#061; &#039;2025-04-01&#039;;<br \/>\nDECLARE &#064;sqlP nvarchar(1000) &#061;<br \/>\n    N&#039;SELECT \/* probe_param *\/ COUNT(*) AS \u884c\u6570, CAST(SUM(AmountUsd) AS decimal(18,2)) AS \u5408\u8ba1<br \/>\n      FROM rpt.OrgSalesFact<br \/>\n      WHERE OrderDate &gt;&#061; &#064;f AND OrderDate &lt; &#064;t;&#039;;<br \/>\nDECLARE &#064;t5 datetime2(7) &#061; SYSDATETIME();<br \/>\nEXEC sys.sp_executesql &#064;sqlP, N&#039;&#064;f date, &#064;t date&#039;, &#064;f &#061; &#064;dtFrom, &#064;t &#061; &#064;dtTo;<br \/>\nSELECT \u65b9\u5f0f &#061; N&#039;\u65e5\u671f\u53c2\u6570\u5316&#039;, \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t5, SYSDATETIME());<\/p>\n<p>\/* &#8212; \u53d7\u63a7\u5b57\u9762\u91cf\u7248\u672c&#xff08;\u6821\u9a8c\u540e\u62fc\u63a5&#xff09;&#8212; *\/<br \/>\n\/* \u6821\u9a8c&#xff1a;\u5fc5\u987b\u662f\u5408\u6cd5\u65e5\u671f&#xff0c;\u4e14\u5728\u5141\u8bb8\u8303\u56f4\u5185 *\/<br \/>\nDECLARE &#064;safeFrom date, &#064;safeTo date;<br \/>\nIF &#064;dtFrom &gt;&#061; &#039;2020-01-01&#039; AND &#064;dtTo &lt;&#061; &#039;2030-12-31&#039; AND &#064;dtFrom &lt; &#064;dtTo<br \/>\nBEGIN<br \/>\n    SET &#064;safeFrom &#061; &#064;dtFrom;<br \/>\n    SET &#064;safeTo   &#061; &#064;dtTo;<br \/>\nEND<br \/>\nELSE<br \/>\n    RAISERROR(N&#039;\u65e5\u671f\u8303\u56f4\u975e\u6cd5&#039;, 16, 1);<\/p>\n<p>DECLARE &#064;sqlL nvarchar(1000) &#061;<br \/>\n    N&#039;SELECT \/* probe_literal *\/ COUNT(*) AS \u884c\u6570, CAST(SUM(AmountUsd) AS decimal(18,2)) AS \u5408\u8ba1<br \/>\n      FROM rpt.OrgSalesFact<br \/>\n      WHERE OrderDate &gt;&#061; &#039;&#039;&#039; &#043; CONVERT(char(8), &#064;safeFrom, 112) &#043; N&#039;&#039;&#039; &#039;<br \/>\n  &#043; N&#039;  AND OrderDate &lt;  &#039;&#039;&#039; &#043; CONVERT(char(8), &#064;safeTo,   112) &#043; N&#039;&#039;&#039;;&#039;;<br \/>\nDECLARE &#064;t6 datetime2(7) &#061; SYSDATETIME();<br \/>\nEXEC (&#064;sqlL);<br \/>\nSELECT \u65b9\u5f0f &#061; N&#039;\u65e5\u671f\u53d7\u63a7\u62fc\u63a5&#xff08;\u5b57\u9762\u91cf&#xff09;&#039;, \u8017\u65f6\u5fae\u79d2 &#061; DATEDIFF(MICROSECOND, &#064;t6, SYSDATETIME());<\/p>\n<p>PRINT N&#039;  \u2605 \u8bf4\u660e&#xff1a;\u672c\u8868\u672a\u505a\u7269\u7406\u5206\u533a&#xff0c;\u6240\u4ee5\u4e24\u8005\u5dee\u5f02\u4e3b\u8981\u6765\u81ea row group \u6d88\u9664 \u2014\u2014&#039;;<br \/>\nPRINT N&#039;    \u5728\u3010\u5df2\u5206\u533a\u3011\u7684\u4e07\u4ebf\u7ea7\u8868\u4e0a&#xff0c;\u5dee\u5f02\u4f1a\u653e\u5927\u5230&#034;\u626b 1 \u4e2a\u6708 vs \u626b 10 \u5e74&#034;\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u62fc\u63a5\u5b57\u9762\u91cf\u7684\u5b89\u5168\u6027\u524d\u63d0&#xff08;\u7f3a\u4e00\u4e0d\u53ef&#xff09;&#xff1a;&#039;;<br \/>\nPRINT N&#039;      1) \u503c\u6765\u81ea\u3010\u5f3a\u7c7b\u578b\u53d8\u91cf\u3011&#xff08;\u6b64\u5904 &#064;dtFrom date&#xff09;&#xff0c;\u4e0d\u662f\u7528\u6237\u539f\u59cb\u5b57\u7b26\u4e32&#039;;<br \/>\nPRINT N&#039;      2) \u7528 CONVERT(char(8), &#064;d, 112) \u8f93\u51fa ISO \u683c\u5f0f&#xff08;yyyyMMdd&#xff09;&#xff0c;\u65e0\u6b67\u4e49&#039;;<br \/>\nPRINT N&#039;      3) \u62fc\u63a5\u524d\u505a\u3010\u8303\u56f4\u6821\u9a8c\u3011&#xff0c;\u975e\u6cd5\u76f4\u63a5\u62d2\u7edd&#039;;<br \/>\nPRINT N&#039;      4) \u7edd\u4e0d\u5bf9\u5b57\u7b26\u4e32\u7c7b\u578b\u7684\u5206\u533a\u952e\u8fd9\u6837\u62fc \u2014\u2014 \u53ea\u5bf9 date\/datetime \u8fd9\u7c7b&#039;<br \/>\nPRINT N&#039;         \u80fd\u5b89\u5168\u683c\u5f0f\u5316\u4e14\u65e0\u5f15\u53f7\u98ce\u9669\u7684\u5f3a\u7c7b\u578b\u503c\u4f7f\u7528\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   8.3  Query Store \u8ba1\u5212\u5f3a\u5236\u4e0e\u52a8\u6001 SQL<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 8.3  Query Store \u8ba1\u5212\u5f3a\u5236&#xff08;Plan Forcing&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u9879\u76ee &#061; N&#039;Query Store \u72b6\u6001&#039;,<br \/>\n    \u503c   &#061; actual_state_desc &#043; N&#039; \/ \u53ea\u8bfb\u539f\u56e0&#061;&#039; &#043; CAST(readonly_reason AS nvarchar(10))<br \/>\nFROM sys.database_query_store_options;<\/p>\n<p>PRINT N&#039;  \u2605 \u52a8\u6001 SQL \u7684\u8ba1\u5212\u3010\u4e5f\u4f1a\u88ab Query Store \u6355\u83b7\u3011&#xff08;\u53ea\u8981\u6587\u672c\u53ef\u89c4\u8303\u5316&#xff09;\u3002&#039;;<br \/>\nPRINT N&#039;    \u8fd9\u5e26\u6765\u4e24\u4e2a\u80fd\u529b&#xff1a;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u8ba1\u5212\u5f3a\u5236&#xff1a;\u9009\u4e2d\u4e00\u4e2a\u5df2\u77e5\u7684\u597d\u8ba1\u5212&#xff0c;\u5f3a\u5236\u540e\u7eed\u6267\u884c\u90fd\u7528\u5b83&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u8ba1\u5212\u56de\u5f52\u68c0\u6d4b&#xff1a;\u53d1\u73b0\u6267\u884c\u8ba1\u5212\u5728\u67d0\u4e2a\u65f6\u95f4\u70b9\u6027\u80fd\u7a81\u7136\u53d8\u5dee&#039;;<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u25b8 \u5f53\u524d Query Store \u4e2d\u5f00\u9500\u6700\u9ad8\u7684 5 \u6761\u67e5\u8be2&#xff1a;&#039;;<br \/>\nSELECT TOP 5<br \/>\n    \u67e5\u8be2\u6587\u672c &#061; LEFT(REPLACE(REPLACE(qt.query_sql_text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), 60),<br \/>\n    \u6267\u884c\u6b21\u6570 &#061; SUM(rs.count_executions),<br \/>\n    \u5e73\u5747\u8017\u65f6ms &#061; CAST(AVG(rs.avg_duration)\/1000.0 AS decimal(18,3)),<br \/>\n    \u662f\u5426\u53ef\u5f3a\u5236 &#061; CASE WHEN MAX(p.plan_id) IS NOT NULL THEN N&#039;\u662f&#039; ELSE N&#039;\u5426&#039; END<br \/>\nFROM sys.query_store_query q<br \/>\nJOIN sys.query_store_query_text qt ON qt.query_text_id &#061; q.query_text_id<br \/>\nJOIN sys.query_store_plan p ON p.query_id &#061; q.query_id<br \/>\nJOIN sys.query_store_runtime_stats rs ON rs.plan_id &#061; p.plan_id<br \/>\nGROUP BY LEFT(REPLACE(REPLACE(qt.query_sql_text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), 60)<br \/>\nORDER BY AVG(rs.avg_duration) DESC;<br \/>\nPRINT N&#039;  \u2605 \u5f3a\u5236\u8ba1\u5212\u8bed\u6cd5&#xff08;\u9700 Query Store \u5df2\u542f\u7528&#xff09;&#xff1a;&#039;;<br \/>\nPRINT N&#039;      EXEC sp_query_store_force_plan &#064;query_id &#061; &#8230;, &#064;plan_id &#061; &#8230;;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6ce8\u610f&#xff1a;Query Store \u6709\u5bb9\u91cf\u4e0a\u9650&#xff0c;\u52a8\u6001 SQL \u8fc7\u591a\u65f6\u4f1a\u81ea\u52a8\u8f6c\u5165\u53ea\u8bfb&#xff1b;&#039;;<br \/>\nPRINT N&#039;    \u5e94\u5b9a\u671f\u68c0\u67e5 sys.database_query_store_options.readonly_reason\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   8.4  \u9ad8\u5e76\u53d1\u4e0b\u7684\u53c2\u6570\u55c5\u63a2\u653e\u5927\u6548\u5e94<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 8.4  \u9ad8\u5e76\u53d1\u4e0b\u7684\u53c2\u6570\u55c5\u63a2\u653e\u5927 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u5355\u7528\u6237\u65f6&#xff0c;\u4e00\u4e2a\u574f\u8ba1\u5212\u53ea\u662f&#034;\u6162\u4e00\u6b21&#034;&#xff08;\u51e0\u767e\u6beb\u79d2&#xff09;&#xff1b;&#039;;<br \/>\nPRINT N&#039;  \u9ad8\u5e76\u53d1\u65f6&#xff0c;\u540c\u4e00\u4e2a\u574f\u8ba1\u5212\u4f1a\u88ab\u6210\u767e\u4e0a\u5343\u4e2a\u4f1a\u8bdd\u3010\u540c\u65f6\u3011\u590d\u7528&#xff0c;&#039;;<br \/>\nPRINT N&#039;  \u6bcf\u4e2a\u4f1a\u8bdd\u90fd\u5728\u505a\u540c\u6837\u4f4e\u6548\u7684\u5168\u626b \u2192 \u5185\u5b58\u3001CPU\u3001IO \u4e09\u91cd\u653e\u5927\u3002&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u653e\u5927\u516c\u5f0f&#xff08;\u8fd1\u4f3c&#xff09;&#xff1a;&#039;;<br \/>\nPRINT N&#039;      \u5b9e\u9645\u8d44\u6e90\u6d88\u8017 \u2248 \u5355\u6b21\u574f\u8ba1\u5212\u6210\u672c \u00d7 \u5e76\u53d1\u4f1a\u8bdd\u6570 \u00d7 \u5e73\u5747\u9a7b\u7559\u65f6\u95f4&#039;;<br \/>\nPRINT N&#039;  \u4f8b&#xff1a;\u4e00\u4e2a\u574f\u8ba1\u5212\u5355\u6b21\u591a\u8017 200 ms CPU&#xff0c;200 \u5e76\u53d1 \u2192 \u6bcf\u79d2\u591a\u8017 40 \u79d2 CPU&#xff0c;&#039;;<br \/>\nPRINT N&#039;      \u5728 6 \u6838\u673a\u5668\u4e0a\u76f4\u63a5\u9971\u548c\u3002&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;  \u2605 \u9ad8\u5e76\u53d1\u573a\u666f\u7684\u53c2\u6570\u55c5\u63a2\u5bf9\u7b56\u4f18\u5148\u7ea7&#xff1a;&#039;;<br \/>\nSELECT \u4f18\u5148\u7ea7 &#061; \u4f18\u5148\u7ea7, \u624b\u6bb5 &#061; \u624b\u6bb5, \u7406\u7531 &#061; \u7406\u7531<br \/>\nFROM (VALUES<br \/>\n    (N&#039;P0&#039;, N&#039;\u5148\u89e3\u51b3 SQL \u672c\u8eab&#xff08;\u52a0\u7d22\u5f15 \/ \u6539\u5199&#xff09;&#xff0c;\u8ba9\u8ba1\u5212\u5dee\u5f02\u53d8\u5c0f&#039;,<br \/>\n     N&#039;&#034;\u574f\u8ba1\u5212&#034;\u5982\u679c\u4e5f\u53ea\u662f\u4e00\u6b21 Seek&#xff0c;\u5c31\u65e0\u6240\u8c13\u55c5\u63a2&#039;),<br \/>\n    (N&#039;P1&#039;, N&#039;\u62c6\u5206\u8fc7\u7a0b &#043; \u6309\u9891\u7387\u5206\u6d3e&#xff08;IF \u9ad8\u9891 EXEC proc1 ELSE EXEC proc2&#xff09;&#039;,<br \/>\n     N&#039;\u8ba1\u5212\u6700\u7a33\u5b9a&#xff0c;\u4e14\u4e0d\u9700\u8981\u6bcf\u6b21\u91cd\u7f16\u8bd1&#039;),<br \/>\n    (N&#039;P2&#039;, N&#039;OPTIMIZE FOR (&#064;p &#061; \u5178\u578b\u503c)&#039;, N&#039;\u96f6\u8fd0\u884c\u65f6\u5f00\u9500&#xff0c;\u9002\u5408\u5df2\u77e5\u9ad8\u9891\u503c&#039;),<br \/>\n    (N&#039;P3&#039;, N&#039;OPTIMIZE FOR UNKNOWN&#039;, N&#039;\u4e0d\u504f\u8892\u4efb\u4f55\u503c&#xff0c;\u4f46\u5bf9\u5178\u578b\u503c\u53ef\u80fd\u7565\u5dee&#039;),<br \/>\n    (N&#039;P4&#039;, N&#039;OPTION (RECOMPILE)&#039;, N&#039;\u6bcf\u6b21\u90fd\u6700\u4f18&#xff0c;\u4f46\u9ad8\u5e76\u53d1\u4e0b\u7f16\u8bd1\u4e89\u7528\u4e25\u91cd&#xff0c;\u6700\u540e\u624d\u7528&#039;)<br \/>\n) v(\u4f18\u5148\u7ea7, \u624b\u6bb5, \u7406\u7531);<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   8.5  \u52a8\u6001 SQL \u7684\u7f13\u5b58\u9884\u7b97\u4f30\u7b97<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 8.5  \u52a8\u6001 SQL \u7f13\u5b58\u9884\u7b97\u4f30\u7b97 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>SELECT<br \/>\n    \u6307\u6807 &#061; \u6307\u6807, \u503c &#061; \u503c, \u8bf4\u660e &#061; \u8bf4\u660e<br \/>\nFROM (VALUES<br \/>\n    (N&#039;Adhoc \u7f13\u5b58\u6761\u76ee\u6570&#039;,<br \/>\n     CAST((SELECT COUNT(*) FROM sys.dm_exec_cached_plans WHERE objtype &#061; &#039;Adhoc&#039;) AS nvarchar(20)),<br \/>\n     N&#039;\u672a\u53c2\u6570\u5316\u7684\u52a8\u6001\/\u5185\u8054 SQL \u6761\u76ee&#039;),<br \/>\n    (N&#039;Adhoc \u7f13\u5b58\u5360\u7528 MB&#039;,<br \/>\n     CAST((SELECT ISNULL(SUM(size_in_bytes),0)\/1048576.0 FROM sys.dm_exec_cached_plans WHERE objtype &#061; &#039;Adhoc&#039;) AS decimal(10,2)),<br \/>\n     N&#039;\u8fd9\u90e8\u5206\u5185\u5b58\u672c\u53ef\u4ee5\u901a\u8fc7\u53c2\u6570\u5316\u7701\u4e0b&#039;),<br \/>\n    (N&#039;\u4ec5\u6267\u884c 1 \u6b21\u7684 Adhoc \u6570&#039;,<br \/>\n     CAST((SELECT COUNT(*) FROM sys.dm_exec_cached_plans WHERE objtype &#061; &#039;Adhoc&#039; AND usecounts &#061; 1) AS nvarchar(20)),<br \/>\n     N&#039;\u5360 Adhoc \u7684\u5927\u591a\u6570 \u2192 \u5178\u578b\u7f13\u5b58\u6d6a\u8d39&#039;),<br \/>\n    (N&#039;\u5168\u90e8\u7f13\u5b58\u6761\u76ee\u6570&#039;,<br \/>\n     CAST((SELECT COUNT(*) FROM sys.dm_exec_cached_plans) AS nvarchar(20)),<br \/>\n     N&#039;\u542b Proc \/ Prepared \/ View \u7b49&#039;)<br \/>\n) v(\u6307\u6807, \u503c, \u8bf4\u660e);<\/p>\n<p>PRINT N&#039;  \u2605 \u4f30\u7b97\u65b9\u6cd5&#xff1a;\u5047\u8bbe\u5e73\u5747\u6bcf\u4e2a Adhoc \u8ba1\u5212 50 KB&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u82e5\u7cfb\u7edf\u6709 10 \u4e07\u6761\u4e0d\u540c\u7684\u52a8\u6001 SQL \u6587\u672c&#xff08;\u62fc\u63a5\u4ea7\u751f\u7684&#xff09;&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u5c31\u662f 5 GB \u8ba1\u5212\u7f13\u5b58 \u2014\u2014 \u5728 32 GB \u673a\u5668\u4e0a\u8db3\u4ee5\u5f15\u53d1\u5185\u5b58\u538b\u529b\u3002&#039;;<br \/>\nPRINT N&#039;    \u53c2\u6570\u5316\u540e\u540c\u6837\u7684\u4e1a\u52a1\u91cf\u53ef\u80fd\u53ea\u9700 5 MB\u3002&#039;;<br \/>\nPRINT N&#039;  \u2605 \u6cbb\u7406\u4f18\u5148\u7ea7&#xff1a;\u2460 \u5f00\u542f optimize for ad hoc workloads&#039;;<br \/>\nPRINT N&#039;                 \u2461 \u6d88\u9664 EXEC \u5b57\u9762\u91cf\u62fc\u63a5&#xff08;\u6539 sp_executesql&#xff09;&#039;;<br \/>\nPRINT N&#039;                 \u2462 \u5bf9\u9ad8\u9891\u52a8\u6001\u67e5\u8be2\u5efa\u5b58\u50a8\u8fc7\u7a0b&#xff08;\u8d70 Proc \u7f13\u5b58&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301009\u3011\u8fd0\u884c\u65f6\u8bca\u65ad \u2014\u2014 \u53ef\u76f4\u63a5\u7528\u4e8e\u751f\u4ea7\u7684\u95ee\u9898\u6392\u67e5\u67e5\u8be2<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u52a8\u6001 SQL \u51fa\u95ee\u9898\u65f6&#xff0c;\u6392\u67e5\u5de5\u5177\u4e0e\u9759\u6001 SQL \u7565\u6709\u4e0d\u540c&#xff08;\u56e0\u4e3a\u8bed\u53e5\u6587\u672c\u662f\u62fc\u51fa\u6765\u7684&#xff09;\u3002<br \/>\n   \u672c\u8282\u7ed9\u51fa 6 \u4e2a\u5b9e\u7528\u8bca\u65ad\u67e5\u8be2\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301009\u3011\u8fd0\u884c\u65f6\u8bca\u65ad&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.1  \u67e5\u627e&#034;\u7f13\u5b58\u4e2d\u6761\u76ee\u6700\u591a&#034;\u7684\u52a8\u6001 SQL \u6a21\u5f0f&#xff08;\u7f13\u5b58\u7206\u70b8\u5b9a\u4f4d&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.1  \u7f13\u5b58\u7206\u70b8\u5b9a\u4f4d&#xff1a;\u540c\u4e00\u6a21\u5f0f\u4ea7\u751f\u6700\u591a\u6761\u76ee\u7684\u8bed\u53e5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT TOP 8<br \/>\n    \/* \u628a\u6570\u5b57\u5b57\u9762\u91cf\u5f52\u4e00\u5316\u6210 #&#xff0c;\u4ece\u800c\u628a&#034;\u540c\u4e00\u6a21\u5f0f\u7684\u4e0d\u540c\u5b9e\u4f8b&#034;\u805a\u5230\u4e00\u8d77 *\/<br \/>\n    \u6a21\u5f0f\u6458\u8981 &#061; LEFT(<br \/>\n        REPLACE(REPLACE(REPLACE(REPLACE(<br \/>\n            t.text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), N&#039;  &#039;, N&#039; &#039;), N&#039;  &#039;, N&#039; &#039;), 70),<br \/>\n    \u6761\u76ee\u6570 &#061; COUNT(*),<br \/>\n    \u5360\u7528KB &#061; SUM(cp.size_in_bytes) \/ 1024<br \/>\nFROM sys.dm_exec_cached_plans cp<br \/>\nCROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\nWHERE cp.objtype IN (&#039;Adhoc&#039;, &#039;Prepared&#039;)<br \/>\nGROUP BY LEFT(<br \/>\n        REPLACE(REPLACE(REPLACE(REPLACE(<br \/>\n            t.text, CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), N&#039;  &#039;, N&#039; &#039;), N&#039;  &#039;, N&#039; &#039;), 70)<br \/>\nHAVING COUNT(*) &gt; 1<br \/>\nORDER BY COUNT(*) DESC;<br \/>\nPRINT N&#039;  \u2605 \u82e5\u67d0\u6a21\u5f0f\u6761\u76ee\u6570\u5f88\u591a \u2192 \u8be5\u5904\u662f&#034;\u5b57\u9762\u91cf\u62fc\u63a5&#034;\u800c\u975e\u53c2\u6570\u5316&#xff0c;\u5e94\u91cd\u70b9\u6539\u9020\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.2  \u5f53\u524d\u6b63\u5728\u6267\u884c\u7684\u52a8\u6001 SQL&#xff08;\u5b9e\u65f6\u6392\u67e5&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.2  \u5f53\u524d\u6d3b\u52a8\u4f1a\u8bdd \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u4f1a\u8bddID   &#061; r.session_id,<br \/>\n    \u72b6\u6001     &#061; r.status,<br \/>\n    \u547d\u4ee4     &#061; r.command,<br \/>\n    \u7b49\u5f85\u7c7b\u578b &#061; ISNULL(r.wait_type, N&#039;(\u8fd0\u884c\u4e2d)&#039;),<br \/>\n    \u5df2\u8fd0\u884c\u79d2 &#061; DATEDIFF(SECOND, r.start_time, GETDATE()),<br \/>\n    CPU\u6beb\u79d2  &#061; r.cpu_time,<br \/>\n    \u903b\u8f91\u8bfb   &#061; r.logical_reads,<br \/>\n    \u8bed\u53e5     &#061; LEFT(REPLACE(REPLACE(ISNULL(t.text, N&#039;(\u65e0)&#039;), CHAR(13), N&#039; &#039;), CHAR(10), N&#039; &#039;), 55)<br \/>\nFROM sys.dm_exec_requests r<br \/>\nOUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t<br \/>\nWHERE r.session_id &lt;&gt; &#064;&#064;SPID<br \/>\nORDER BY r.cpu_time DESC;<br \/>\nPRINT N&#039;  \u2605 \u6ce8\u610f&#xff1a;sp_executesql \u5185\u6267\u884c\u7684\u8bed\u53e5&#xff0c;sql_handle \u6307\u5411\u3010\u5916\u5c42\u8fc7\u7a0b\u7684\u6587\u672c\u3011&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u8981\u770b\u5230\u771f\u6b63\u7684\u52a8\u6001\u8bed\u53e5&#xff0c;\u9700\u914d\u5408 sys.dm_exec_input_buffer(session_id, NULL)\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.3  \u52a8\u6001 SQL \u7684\u9519\u8bef\u6355\u83b7&#xff08;TRY\/CATCH &#043; \u5173\u952e\u4e0a\u4e0b\u6587&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.3  \u52a8\u6001 SQL \u9519\u8bef\u6355\u83b7\u7684\u5b8c\u6574\u6a21\u677f \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>DECLARE &#064;badSql nvarchar(500) &#061; N&#039;SELECT * FROM erp.NoSuchTable_Demo;&#039;;<br \/>\nBEGIN TRY<br \/>\n    EXEC sys.sp_executesql &#064;badSql;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    PRINT N&#039;    \u9519\u8bef\u53f7   &#061; &#039; &#043; CAST(ERROR_NUMBER()   AS nvarchar(10));<br \/>\n    PRINT N&#039;    \u4e25\u91cd\u7ea7\u522b &#061; &#039; &#043; CAST(ERROR_SEVERITY() AS nvarchar(10));<br \/>\n    PRINT N&#039;    \u72b6\u6001     &#061; &#039; &#043; CAST(ERROR_STATE()    AS nvarchar(10));<br \/>\n    PRINT N&#039;    \u884c\u53f7     &#061; &#039; &#043; CAST(ERROR_LINE()     AS nvarchar(10));<br \/>\n    PRINT N&#039;    \u6d88\u606f     &#061; &#039; &#043; ERROR_MESSAGE();<br \/>\n    PRINT N&#039;    &#039;;<br \/>\n    PRINT N&#039;    \u2605 \u52a8\u6001 SQL \u6392\u9519\u5fc5\u8bb0\u7684\u56db\u4e2a\u8981\u70b9&#xff1a;&#039;;<br \/>\n    PRINT N&#039;      1) ERROR_LINE() \u62a5\u7684\u662f\u3010\u52a8\u6001\u8bed\u53e5\u5185\u90e8\u3011\u7684\u884c\u53f7&#xff0c;\u4e0d\u662f\u5916\u5c42\u8fc7\u7a0b\u7684\u884c\u53f7&#039;;<br \/>\n    PRINT N&#039;      2) \u628a &#064;badSql \u7684\u503c\u4e00\u8d77\u8bb0\u8fdb\u65e5\u5fd7&#xff0c;\u5426\u5219\u4e8b\u540e\u65e0\u6cd5\u590d\u73b0&#039;;<br \/>\n    PRINT N&#039;      3) \u7528 ERROR_PROCEDURE() \u533a\u5206\u662f\u8fc7\u7a0b\u672c\u8eab\u8fd8\u662f\u52a8\u6001\u8bed\u53e5\u51fa\u9519&#039;;<br \/>\n    PRINT N&#039;      4) XACT_ABORT ON \u65f6&#xff0c;\u67d0\u4e9b\u9519\u8bef\u4f1a\u76f4\u63a5\u7ec8\u6b62\u4e8b\u52a1&#xff0c;\u614e\u7528\u5d4c\u5957 TRY&#039;;<br \/>\nEND CATCH<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.4  \u672c\u6b21\u4f1a\u8bdd\u5df2\u6784\u9020\u7684\u52a8\u6001 SQL \u5ba1\u8ba1&#xff08;\u6765\u81ea\u672c\u8282\u7684\u65e5\u5fd7\u8868&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.4  \u52a8\u6001 SQL \u5ba1\u8ba1\u65e5\u5fd7&#xff08;\u805a\u5408&#xff09;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u8fc7\u7a0b          &#061; ISNULL(ProcName, N&#039;(\u76f4\u63a5\u8c03\u7528)&#039;),<br \/>\n    \u8c03\u7528\u6b21\u6570      &#061; COUNT(*),<br \/>\n    \u5e73\u5747\u8017\u65f6\u5fae\u79d2  &#061; CAST(AVG(CAST(ElapsedUs AS float)) AS decimal(18,1)),<br \/>\n    \u6700\u957f\u8017\u65f6\u5fae\u79d2  &#061; MAX(ElapsedUs),<br \/>\n    \u6700\u8fd1\u8c03\u7528      &#061; CONVERT(char(19), MAX(LoggedAt), 120)<br \/>\nFROM dbo.Dyn_SearchLog<br \/>\nGROUP BY ISNULL(ProcName, N&#039;(\u76f4\u63a5\u8c03\u7528)&#039;);<br \/>\nPRINT N&#039;  \u2605 \u751f\u4ea7\u5efa\u8bae&#xff1a;\u628a Dyn_SearchLog \u4e4b\u7c7b\u7684\u5ba1\u8ba1\u8868\u63a5\u5165\u76d1\u63a7&#xff0c;&#039;;<br \/>\nPRINT N&#039;    \u5bf9&#034;\u8017\u65f6\u7a81\u589e&#034;\u6216&#034;\u542b\u53ef\u7591\u5b57\u7b26\u7684\u8fc7\u6ee4\u5668&#034;\u544a\u8b66\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.5  \u53ef\u7591\u8f93\u5165\u6a21\u5f0f\u68c0\u6d4b&#xff08;\u6ce8\u5165\u5c1d\u8bd5\u7684\u8ff9\u8c61&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.5  \u6ce8\u5165\u5c1d\u8bd5\u68c0\u6d4b \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u65e5\u5fd7ID   &#061; LogId,<br \/>\n    \u65f6\u95f4     &#061; CONVERT(char(19), LoggedAt, 120),<br \/>\n    \u8fc7\u6ee4\u5668   &#061; LEFT(FilterJson, 60),<br \/>\n    \u5224\u5b9a     &#061; CASE<br \/>\n                 WHEN FilterJson LIKE N&#039;%&#8211;%&#039;            THEN N&#039;\u26a0 \u542b SQL \u6ce8\u91ca\u7b26 &#8211;&#039;<br \/>\n                 WHEN FilterJson LIKE N&#039;%&#039;&#039;%&#039;            THEN N&#039;\u26a0 \u542b\u5355\u5f15\u53f7&#039;<br \/>\n                 WHEN FilterJson LIKE N&#039;%OR 1&#061;1%&#039;        THEN N&#039;\u26a0 \u7ecf\u5178\u6ce8\u5165\u7279\u5f81&#039;<br \/>\n                 WHEN FilterJson LIKE N&#039;%UNION%&#039;         THEN N&#039;\u26a0 \u542b UNION&#039;<br \/>\n                 WHEN FilterJson LIKE N&#039;%DROP%&#039;          THEN N&#039;\u26a0 \u542b DROP&#039;<br \/>\n                 WHEN FilterJson LIKE N&#039;%;%&#039;             THEN N&#039;\u26a0 \u542b\u5206\u53f7&#039;<br \/>\n                 ELSE N&#039;\u2713 \u6b63\u5e38&#039;<br \/>\n               END<br \/>\nFROM dbo.Dyn_SearchLog<br \/>\nWHERE FilterJson LIKE N&#039;%&#8211;%&#039; OR FilterJson LIKE N&#039;%&#039;&#039;%&#039;<br \/>\n   OR FilterJson LIKE N&#039;%OR 1&#061;1%&#039; OR FilterJson LIKE N&#039;%UNION%&#039;<br \/>\n   OR FilterJson LIKE N&#039;%DROP%&#039; OR FilterJson LIKE N&#039;%;%&#039;<br \/>\nORDER BY LogId;<br \/>\nPRINT N&#039;  \u2605 \u4e0a\u8868\u5e94\u80fd\u770b\u5230\u7b2c 04 \u8282\u6545\u610f\u6ce8\u5165\u7684\u4e24\u4e2a\u8f7d\u8377 \u2014\u2014 \u8fd9\u5c31\u662f&#034;\u770b\u89c1\u653b\u51fb&#034;\u7684\u80fd\u529b\u3002&#039;;<\/p>\n<p>\/* &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n   9.6  \u6743\u9650\u68c0\u67e5&#xff1a;\u5f53\u524d\u8eab\u4efd\u80fd\u505a\u4ec0\u4e48&#xff08;\u90e8\u7f72\u524d\u81ea\u68c0&#xff09;<br \/>\n   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 9.6  \u5f53\u524d\u8eab\u4efd\u4e0e\u6743\u9650\u81ea\u68c0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u5f53\u524d\u7528\u6237 &#061; USER_NAME(),<br \/>\n    \u5f53\u524d\u767b\u5f55 &#061; SUSER_NAME(),<br \/>\n    [\u662f\u5426sysadmin] &#061; CASE WHEN IS_SRVROLEMEMBER(&#039;sysadmin&#039;) &#061; 1 THEN N&#039;\u662f&#039; ELSE N&#039;\u5426&#039; END,<br \/>\n    \/* \u2605 \u7528 STRING_AGG \u66ff\u4ee3\u8001\u5f0f\u7684 FOR XML PATH(&#039;&#039;) \u62fc\u4e32\u5199\u6cd5&#xff08;\u66f4\u7b80\u6d01&#xff09;*\/<br \/>\n    \u6570\u636e\u5e93\u89d2\u8272 &#061; ISNULL((<br \/>\n        SELECT STRING_AGG(r.name, N&#039;,&#039;)<br \/>\n        FROM sys.database_role_members rm<br \/>\n        JOIN sys.database_principals r ON r.principal_id &#061; rm.role_principal_id<br \/>\n        JOIN sys.database_principals u ON u.principal_id &#061; rm.member_principal_id<br \/>\n        WHERE u.name &#061; USER_NAME()<br \/>\n    ), N&#039;(\u65e0)&#039;);<br \/>\nPRINT N&#039;  \u2605 \u90e8\u7f72\u52a8\u6001 SQL \u5b58\u50a8\u8fc7\u7a0b\u524d&#xff0c;\u52a1\u5fc5\u786e\u8ba4&#xff1a;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u662f\u5426\u9700\u8981 EXECUTE AS \/ \u6a21\u5757\u7b7e\u540d&#xff08;\u5426\u5219\u666e\u901a\u7528\u6237\u4f1a\u649e 229&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u8c03\u7528\u8005\u662f\u5426\u88ab\u6388\u4e88\u4e86 EXECUTE \u6743\u9650&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u547d\u4ee4\u662f\u5426\u88ab\u6388\u4e88\u4e86\u4e0d\u5fc5\u8981\u7684\u57fa\u8868\u6743\u9650&#xff08;\u6700\u5c0f\u6743\u9650\u539f\u5219&#xff09;&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301010\u3011\u51b3\u7b56\u6e05\u5355 \u2014\u2014 \u4ec0\u4e48\u65f6\u5019\u7528\u54ea\u79cd\u65b9\u6848<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u8fd9\u662f\u5168\u7bc7\u7684&#034;\u901f\u67e5\u8868&#034;\u3002\u9047\u5230\u9700\u6c42\u65f6&#xff0c;\u4ece\u4e0a\u5f80\u4e0b\u5bf9\u7167\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301010\u3011\u51b3\u7b56\u6e05\u5355&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 10.1  \u6309\u9700\u6c42\u9009\u65b9\u6848 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u9700\u6c42                     &#061; \u9700\u6c42,<br \/>\n    \u63a8\u8350\u65b9\u6848                 &#061; \u63a8\u8350\u65b9\u6848,<br \/>\n    \u7406\u7531                     &#061; \u7406\u7531<br \/>\nFROM (VALUES<br \/>\n    (N&#039;\u6761\u4ef6\u5b8c\u5168\u56fa\u5b9a&#039;,           N&#039;\u9759\u6001 SQL&#039;,                       N&#039;\u96f6\u6ce8\u5165\u9762\u3001\u81ea\u52a8\u53c2\u6570\u5316\u3001\u53ef\u8bfb\u6027\u6700\u597d&#039;),<br \/>\n    (N&#039;\u6761\u4ef6\u53ef\u9009&#xff08;\u5c11\u91cf\u7ec4\u5408&#xff09;&#039;,   N&#039;\u9759\u6001 SQL &#043; bit \u5f00\u5173\u53c2\u6570&#039;,        N&#039;\u4e00\u6761\u8bed\u53e5\u5e94\u5bf9\u6240\u6709\u7ec4\u5408&#xff0c;\u8ba1\u5212\u7a33\u5b9a&#xff08;\u89c1 03.3 \u505a\u6cd5\u2460&#xff09;&#039;),<br \/>\n    (N&#039;\u6761\u4ef6\u53ef\u9009&#xff08;\u5927\u91cf\u7ec4\u5408&#xff09;&#039;,   N&#039;\u52a8\u6001\u62fc\u63a5\u7ed3\u6784 &#043; sp_executesql \u4f20\u53c2&#039;, N&#039;\u8ba1\u5212\u6700\u8d34\u5408\u8c13\u8bcd&#xff08;\u89c1 04.2&#xff09;&#039;),<br \/>\n    (N&#039;IN \u5217\u8868\u6765\u81ea\u7528\u6237\u591a\u9009&#039;,    N&#039;STRING_SPLIT \u2192 #temp \u8868 &#043; EXISTS&#039;, N&#039;\u5217\u8868\u4f5c\u4e3a&#034;\u5173\u7cfb&#034;\u800c\u975e&#034;\u6587\u672c&#034;&#xff08;\u89c1 04.2&#xff0c;\u6ce8\u610f\u4e0d\u80fd\u7528\u8868\u53d8\u91cf&#xff09;&#039;),<br \/>\n    (N&#039;\u6392\u5e8f\u5217\/\u65b9\u5411\u6765\u81ea\u7528\u6237&#039;,    N&#039;\u767d\u540d\u5355\u6620\u5c04 &#043; QUOTENAME&#039;,          N&#039;\u6807\u8bc6\u7b26\u7edd\u4e0d\u80fd\u76f4\u63a5\u7528\u7528\u6237\u8f93\u5165&#xff08;\u89c1 05.4&#xff09;&#039;),<br \/>\n    (N&#039;\u8868\u540d\/\u5217\u540d\u9700\u8981\u52a8\u6001&#039;,      N&#039;\u767d\u540d\u5355\u8868 &#043; QUOTENAME \u53cc\u5c42&#039;,       N&#039;\u9ed8\u8ba4\u62d2\u7edd&#xff08;\u89c1 05.2 \/ 05.4&#xff09;&#039;),<br \/>\n    (N&#039;\u9700\u8981\u8de8\u6743\u9650\u8bbf\u95ee\u57fa\u8868&#039;,     N&#039;EXECUTE AS OWNER \u6216\u6a21\u5757\u7b7e\u540d&#039;,     N&#039;\u540e\u8005\u6743\u9650\u66f4\u7cbe\u786e&#xff08;\u89c1 06.3 \/ 06.4&#xff09;&#039;),<br \/>\n    (N&#039;\u6df1\u5206\u9875&#xff08;\u4e07\u4ebf\u7ea7&#xff09;&#039;,       N&#039;\u952e\u96c6\u5206\u9875&#xff08;WHERE key &gt; &#064;last&#xff09;&#039;,   N&#039;OFFSET \u4ee3\u4ef7\u7ebf\u6027\u589e\u957f&#xff08;\u89c1 08.1&#xff09;&#039;),<br \/>\n    (N&#039;\u5206\u533a\u8868 &#043; \u65e5\u671f\u8fc7\u6ee4&#039;,      N&#039;\u5206\u533a\u952e\u7528\u53d7\u63a7\u5b57\u9762\u91cf&#xff0c;\u5176\u5b83\u53c2\u6570\u5316&#039;,  N&#039;\u53c2\u6570\u5316\u4f1a\u5931\u53bb\u5206\u533a\u88c1\u526a&#xff08;\u89c1 08.2&#xff09;&#039;),<br \/>\n    (N&#039;\u8ba1\u5212\u4e0d\u7a33\u5b9a&#xff08;\u55c5\u63a2&#xff09;&#039;,     N&#039;\u62c6\u8fc7\u7a0b\u5206\u6d3e &gt; OPTIMIZE FOR &gt; RECOMPILE&#039;, N&#039;\u6309\u7a33\u5b9a\u6027\u4e0e\u5f00\u9500\u6743\u8861&#xff08;\u89c1 08.4&#xff09;&#039;),<br \/>\n    (N&#039;\u8ba1\u5212\u7f13\u5b58\u81a8\u80c0&#039;,           N&#039;\u5f00 optimize for ad hoc workloads&#039;, N&#039;\u6027\u4ef7\u6bd4\u6700\u9ad8&#xff08;\u89c1 07.4&#xff09;&#039;)<br \/>\n) v(\u9700\u6c42, \u63a8\u8350\u65b9\u6848, \u7406\u7531);<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 10.2  \u52a8\u6001 SQL \u4e0a\u751f\u4ea7\u524d\u7684\u68c0\u67e5\u6e05\u5355 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT<br \/>\n    \u68c0\u67e5\u9879 &#061; \u68c0\u67e5\u9879, \u901a\u8fc7\u6807\u51c6 &#061; \u901a\u8fc7\u6807\u51c6<br \/>\nFROM (VALUES<br \/>\n    (N&#039;1. \u503c\u662f\u5426\u5168\u90e8\u53c2\u6570\u5316&#039;,       N&#039;SQL \u6587\u672c\u91cc\u6ca1\u6709\u6765\u81ea\u5916\u90e8\u7684\u5b57\u7b26\u4e32\/\u6570\u5b57\u5b57\u9762\u91cf&#039;),<br \/>\n    (N&#039;2. \u6807\u8bc6\u7b26\u662f\u5426\u8d70\u767d\u540d\u5355&#039;,     N&#039;\u8868\u540d\/\u5217\u540d\/\u6392\u5e8f\u65b9\u5411\u90fd\u80fd\u5728\u4ee3\u7801\u91cc\u627e\u5230\u6620\u5c04\u8868\u6216 CASE&#039;),<br \/>\n    (N&#039;3. \u662f\u5426\u6709 QUOTENAME \u515c\u5e95&#039;,  N&#039;\u62fc\u63a5\u6807\u8bc6\u7b26\u5904\u90fd\u6709 QUOTENAME(&#8230;,&#039;&#039;[&#039;&#039;) \u6216 &#039;&#039;&#034;&#039; &#043; &#039;&#039;&#039;&#039;),<br \/>\n    (N&#039;4. \u5165\u53c2\u662f\u5426\u6821\u9a8c&#039;,           N&#039;\u957f\u5ea6\/\u8303\u56f4\/\u679a\u4e3e\/\u65b9\u5411\u90fd\u6709\u68c0\u67e5&#xff0c;\u975e\u6cd5\u8f93\u5165\u76f4\u63a5\u62d2\u7edd&#039;),<br \/>\n    (N&#039;5. \u6743\u9650\u662f\u5426\u6700\u5c0f\u5316&#039;,         N&#039;\u666e\u901a\u7528\u6237\u53ea\u80fd EXECUTE \u8fc7\u7a0b&#xff0c;\u4e0d\u80fd\u76f4\u63a5\u8bfb\u5199\u57fa\u8868&#039;),<br \/>\n    (N&#039;6. \u6267\u884c\u4e0a\u4e0b\u6587\u662f\u5426\u6b63\u786e&#039;,     N&#039;\u52a8\u6001 SQL \u9700\u8981\u7684\u6743\u9650\u5df2\u901a\u8fc7 EXECUTE AS \/ \u7b7e\u540d\u89e3\u51b3&#039;),<br \/>\n    (N&#039;7. \u662f\u5426\u6709\u5ba1\u8ba1&#039;,             N&#039;\u8bb0\u5f55\u8fc7\u6ee4\u5668\u6458\u8981\u3001\u8017\u65f6\u3001\u8c03\u7528\u8005&#xff0c;\u5f02\u5e38\u53ef\u8ffd\u6eaf&#039;),<br \/>\n    (N&#039;8. \u5206\u9875\u662f\u5426\u9632\u6df1\u7ffb\u9875&#039;,       N&#039;\u6709 PageSize \u4e0a\u9650&#xff1b;\u5927\u8868\u7528\u952e\u96c6\u5206\u9875&#039;),<br \/>\n    (N&#039;9. \u7f13\u5b58\u662f\u5426\u4f1a\u81a8\u80c0&#039;,         N&#039;\u5df2\u8bc4\u4f30&#xff1b;\u5efa\u8bae\u5f00\u542f optimize for ad hoc workloads&#039;),<br \/>\n    (N&#039;10. \u9519\u8bef\u5904\u7406\u662f\u5426\u5b8c\u6574&#039;,      N&#039;TRY\/CATCH&#xff0c;\u8bb0\u5f55 &#064;sql \u539f\u6587\u4e0e ERROR_LINE&#039;),<br \/>\n    (N&#039;11. SQL \u6587\u672c\u7c7b\u578b\u662f\u5426 nvarchar&#039;, N&#039;\u6240\u6709\u627f\u8f7d SQL \u7684\u53d8\u91cf\u58f0\u660e\u4e3a nvarchar&#xff0c;\u5b57\u9762\u91cf\u52a0 N \u524d\u7f00&#039;),<br \/>\n    (N&#039;12. \u662f\u5426\u6709\u6027\u80fd\u57fa\u7ebf&#039;,        N&#039;\u4e0a\u7ebf\u524d\u540e\u6709\u5b9e\u9645\u6267\u884c\u8ba1\u5212\u4e0e\u8017\u65f6\u5bf9\u6bd4&#039;)<br \/>\n) v(\u68c0\u67e5\u9879, \u901a\u8fc7\u6807\u51c6);<\/p>\n<p>PRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500 10.3  \u5e38\u89c1\u53cd\u6a21\u5f0f\u901f\u67e5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nSELECT \u53cd\u6a21\u5f0f &#061; \u53cd\u6a21\u5f0f, \u540e\u679c &#061; \u540e\u679c, \u6b63\u786e\u505a\u6cd5 &#061; \u6b63\u786e\u505a\u6cd5<br \/>\nFROM (VALUES<br \/>\n    (N&#039;EXEC(&#039;&#039;&#8230; &#039;&#039; &#043; &#064;userInput &#043; &#039;&#039; &#8230;&#039;&#039;)&#039;,   N&#039;SQL \u6ce8\u5165&#039;,           N&#039;sp_executesql &#043; \u53c2\u6570&#039;),<br \/>\n    (N&#039;&#039;&#039; AND col IN (&#039;&#039; &#043; &#064;list &#043; &#039;&#039;)&#039;&#039;&#039;,        N&#039;SQL \u6ce8\u5165 &#043; \u7c7b\u578b\u95ee\u9898&#039;, N&#039;STRING_SPLIT &#043; #temp &#043; EXISTS&#039;),<br \/>\n    (N&#039;&#039;&#039; ORDER BY &#039;&#039; &#043; &#064;userCol&#039;,                N&#039;\u6ce8\u5165 \/ \u76f2\u6ce8&#039;,         N&#039;\u767d\u540d\u5355\u6620\u5c04 &#043; QUOTENAME&#039;),<br \/>\n    (N&#039;&#039;&#039; FROM &#039;&#039; &#043; &#064;userTable&#039;,                  N&#039;\u6ce8\u5165 &#043; \u8d8a\u6743&#039;,         N&#039;\u767d\u540d\u5355\u8868 &#043; QUOTENAME&#039;),<br \/>\n    (N&#039;&#064;sql varchar(max)&#039;,                        N&#039;\u4e2d\u6587\u4e71\u7801 \/ 214&#039;,      N&#039;&#064;sql nvarchar(max)&#039;),<br \/>\n    (N&#039;\u52a8\u6001 SQL \u91cc\u5f15\u7528\u5916\u5c42\u8868\u53d8\u91cf&#039;,                N&#039;1087 \u53d8\u91cf\u672a\u58f0\u660e&#039;,     N&#039;\u6539\u7528 #temp \u8868&#039;),<br \/>\n    (N&#039;\u52a8\u6001 SQL \u91cc\u5f15\u7528\u5916\u5c42 #temp&#039;,                N&#039;&#xff08;\u53ef\u884c&#xff0c;\u4f46\u8981\u6ce8\u610f\u4f5c\u7528\u57df&#xff09;&#039;, N&#039;\u786e\u4fdd #temp \u5728\u5916\u5c42\u521b\u5efa&#039;),<br \/>\n    (N&#039;\u53ea\u5728 EXEC \u91cc\u62fc\u65e5\u671f\u5b57\u9762\u91cf\u3001\u4e0d\u505a\u6821\u9a8c&#039;,       N&#039;\u683c\u5f0f\u6ce8\u5165 \/ \u8bed\u4e49\u9519\u8bef&#039;,  N&#039;\u7528\u5f3a\u7c7b\u578b\u53d8\u91cf &#043; CONVERT(&#8230;,112) &#043; \u6821\u9a8c&#039;),<br \/>\n    (N&#039;\u7528 DBCC FREEPROCCACHE \u505a\u6027\u80fd\u5bf9\u6bd4&#039;,         N&#039;\u62d6\u57ae\u5168\u5b9e\u4f8b&#039;,          N&#039;\u6309\u53e5\u67c4\u6e05\u7406\u6216\u53ea\u7edf\u8ba1 LIKE \u5339\u914d&#039;)<br \/>\n) v(\u53cd\u6a21\u5f0f, \u540e\u679c, \u6b63\u786e\u505a\u6cd5);<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301011\u3011\u81ea\u9a8c\u8bc1 V1 ~ V16<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u2605 \u672c\u8282\u5fc5\u987b\u3010\u6574\u4f53\u662f\u4e00\u4e2a\u6279\u6b21\u3011\u2014\u2014 \u4e2d\u95f4\u4e0d\u80fd\u6709 GO&#xff0c;<br \/>\n     \u5426\u5219 &#064;pass \/ &#064;fail \u53d8\u91cf\u4f1a\u88ab\u5207\u65ad&#xff0c;\u62a5 137\u300c\u5fc5\u987b\u58f0\u660e\u6807\u91cf\u53d8\u91cf &#064;pass\u300d\u3002<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301011\u3011\u81ea\u9a8c\u8bc1 V1 ~ V16&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<\/p>\n<p>DECLARE &#064;pass int &#061; 0, &#064;fail int &#061; 0;<br \/>\nDECLARE &#064;msg nvarchar(400);<\/p>\n<p>\/* &#8212; V1&#xff1a;\u6f14\u793a\u5bf9\u8c61\u5168\u90e8\u5b58\u5728 &#8212; *\/<br \/>\nIF OBJECT_ID(N&#039;dbo.Dyn_AllowedTable&#039;,  N&#039;U&#039;) IS NOT NULL<br \/>\nAND OBJECT_ID(N&#039;dbo.Dyn_AllowedColumn&#039;, N&#039;U&#039;) IS NOT NULL<br \/>\nAND OBJECT_ID(N&#039;dbo.Dyn_SearchLog&#039;,     N&#039;U&#039;) IS NOT NULL<br \/>\nAND OBJECT_ID(N&#039;dbo.Dyn_InjectionDemo&#039;, N&#039;U&#039;) IS NOT NULL<br \/>\nAND OBJECT_ID(N&#039;dbo.Dyn_ResultCheck&#039;,   N&#039;U&#039;) IS NOT NULL<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V1  \u2713 \u4e94\u4e2a\u6f14\u793a\u8868\u5168\u90e8\u5b58\u5728&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V1  \u2717 \u6709\u6f14\u793a\u8868\u7f3a\u5931&#039;; END<\/p>\n<p>\/* &#8212; V2&#xff1a;\u767d\u540d\u5355\u5185\u5bb9\u5b8c\u6574&#xff08;6 \u8868 \/ 20 \u5217&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;tblCnt int &#061; (SELECT COUNT(*) FROM dbo.Dyn_AllowedTable  WHERE IsEnabled &#061; 1);<br \/>\nDECLARE &#064;colCnt int &#061; (SELECT COUNT(*) FROM dbo.Dyn_AllowedColumn WHERE IsEnabled &#061; 1);<br \/>\nIF &#064;tblCnt &#061; 6 AND &#064;colCnt &#061; 20<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V2  \u2713 \u767d\u540d\u5355\u5b8c\u6574&#xff1a;&#039; &#043; CAST(&#064;tblCnt AS nvarchar(5)) &#043; N&#039; \u8868 \/ &#039; &#043; CAST(&#064;colCnt AS nvarchar(5)) &#043; N&#039; \u5217&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V2  \u2717 \u767d\u540d\u5355\u6570\u91cf\u4e0d\u7b26&#xff1a;&#039; &#043; CAST(&#064;tblCnt AS nvarchar(5)) &#043; N&#039; \/ &#039; &#043; CAST(&#064;colCnt AS nvarchar(5)); END<\/p>\n<p>\/* &#8212; V3&#xff1a;\u6ce8\u5165\u9776\u573a\u8868\u672a\u88ab\u5220\u9664&#xff08;\u8bc1\u660e DROP \u6ce8\u5165\u5931\u8d25&#xff09;&#8212; *\/<br \/>\nIF OBJECT_ID(N&#039;dbo.Dyn_InjectionDemo&#039;, N&#039;U&#039;) IS NOT NULL<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V3  \u2713 \u6ce8\u5165\u9776\u573a\u8868\u4ecd\u5728 \u2014\u2014 DROP \u6ce8\u5165\u88ab\u963b\u6b62&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V3  \u2717 \u9776\u573a\u8868\u88ab\u5220\u9664&#xff0c;\u6ce8\u5165\u6210\u529f&#xff01;&#039;; END<\/p>\n<p>\/* &#8212; V4&#xff1a;\u9776\u573a\u79d8\u5bc6\u884c\u4ecd\u53ef\u88ab\u5408\u6cd5\u8bfb\u51fa&#xff08;\u8bf4\u660e\u8868\u672a\u88ab\u7834\u574f&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;secretCnt int &#061; (SELECT COUNT(*) FROM dbo.Dyn_InjectionDemo WHERE IsSecret &#061; 1);<br \/>\nIF &#064;secretCnt &#061; 1<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V4  \u2713 \u9776\u573a\u6570\u636e\u5b8c\u6574&#xff08;\u542b 1 \u6761\u79d8\u5bc6\u884c&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V4  \u2717 \u9776\u573a\u6570\u636e\u5f02\u5e38&#xff0c;\u79d8\u5bc6\u884c\u6570 &#061; &#039; &#043; CAST(&#064;secretCnt AS nvarchar(5)); END<\/p>\n<p>\/* &#8212; V5&#xff1a;\u53c2\u6570\u5316\u786e\u5b9e\u6321\u4f4f\u4e86\u6ce8\u5165 &#8212; *\/<br \/>\nDECLARE &#064;inj nvarchar(100) &#061; N&#039;SKU-0001&#039;&#039; OR &#039;&#039;1&#039;&#039;&#061;&#039;&#039;1&#039;;<br \/>\nDECLARE &#064;hit int &#061; (SELECT COUNT(*) FROM dbo.Dyn_InjectionDemo WHERE Sku &#061; &#064;inj);<br \/>\nIF &#064;hit &#061; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V5  \u2713 \u53c2\u6570\u5316\u6321\u4f4f\u6ce8\u5165&#xff08;\u547d\u4e2d 0 \u884c&#xff0c;\u672a\u77ed\u8def&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V5  \u2717 \u53c2\u6570\u5316\u5931\u6548&#xff0c;\u547d\u4e2d &#039; &#043; CAST(&#064;hit AS nvarchar(5)) &#043; N&#039; \u884c&#039;; END<\/p>\n<p>\/* &#8212; V6&#xff1a;\u767d\u540d\u5355\u51fd\u6570\u6b63\u786e\u653e\u884c\/\u62d2\u7edd &#8212; *\/<br \/>\nIF dbo.fn_Dyn_IsSafeIdentifier(N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;OrderNo&#039;) &#061; 1<br \/>\nAND dbo.fn_Dyn_IsSafeIdentifier(N&#039;erp&#039;, N&#039;SalesOrder&#039;, N&#039;Password&#039;) &#061; 0<br \/>\nAND dbo.fn_Dyn_IsSafeIdentifier(N&#039;dbo&#039;, N&#039;sysusers&#039;, N&#039;name&#039;) &#061; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V6  \u2713 \u767d\u540d\u5355\u51fd\u6570&#xff1a;\u653e\u884c\u5408\u6cd5\u5217\u3001\u62d2\u7edd\u975e\u6cd5\u5217&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V6  \u2717 \u767d\u540d\u5355\u51fd\u6570\u5224\u5b9a\u9519\u8bef&#039;; END<\/p>\n<p>\/* &#8212; V7&#xff1a;\u52a8\u6001\u67e5\u8be2\u8fc7\u7a0b\u5b58\u5728 &#8212; *\/<br \/>\nIF OBJECT_ID(N&#039;dbo.usp_Dyn_SearchOrders_Dynamic&#039;, N&#039;P&#039;) IS NOT NULL<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V7  \u2713 \u52a8\u6001\u67e5\u8be2\u6784\u5efa\u5668\u8fc7\u7a0b\u5b58\u5728&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V7  \u2717 \u52a8\u6001\u67e5\u8be2\u6784\u5efa\u5668\u8fc7\u7a0b\u7f3a\u5931&#039;; END<\/p>\n<p>\/* &#8212; V8&#xff1a;\u52a8\u6001\u8fc7\u7a0b\u80fd\u6b63\u786e\u8fd4\u56de\u6570\u636e &#8212; *\/<br \/>\nDECLARE &#064;cntHK int;<br \/>\nDECLARE &#064;sqlV8 nvarchar(500) &#061;<br \/>\n    N&#039;SELECT &#064;c &#061; COUNT(*) FROM erp.SalesOrder WHERE CountryCode &#061; &#064;cc;&#039;;<br \/>\nEXEC sys.sp_executesql &#064;sqlV8, N&#039;&#064;c int OUTPUT, &#064;cc char(2)&#039;, &#064;c &#061; &#064;cntHK OUTPUT, &#064;cc &#061; N&#039;HK&#039;;<br \/>\nIF &#064;cntHK &#061; 1200<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V8  \u2713 \u52a8\u6001 SQL \u8fd4\u56de\u503c\u6b63\u786e&#xff08;HK &#061; 1200&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V8  \u2717 \u52a8\u6001 SQL \u8fd4\u56de\u503c\u9519\u8bef&#xff1a;&#039; &#043; CAST(&#064;cntHK AS nvarchar(10)); END<\/p>\n<p>\/* &#8212; V9&#xff1a;\u8ba1\u5212\u590d\u7528\u88ab\u9a8c\u8bc1&#xff08;\u53c2\u6570\u5316\u6761\u76ee\u6570\u8fdc\u5c11\u4e8e\u6267\u884c\u6b21\u6570&#xff09;&#8212;<br \/>\n   \u2605 \u6ce8\u610f&#xff1a;\u8ba1\u5212\u7f13\u5b58\u662f\u3010\u5b9e\u4f8b\u5171\u4eab\u3011\u7684&#xff0c;\u5176\u5b83\u4f1a\u8bdd\u4e5f\u53ef\u80fd\u7559\u4e0b\u540c\u540d\u8bed\u53e5&#xff0c;<br \/>\n     \u6240\u4ee5\u8fd9\u91cc\u4e0d\u505a\u7edd\u5bf9\u503c\u65ad\u8a00&#xff0c;\u800c\u662f\u9a8c\u8bc1&#034;\u590d\u7528\u786e\u5b9e\u53d1\u751f&#034;\u8fd9\u4e00\u4e8b\u5b9e&#xff1a;<br \/>\n     \u53c2\u6570\u5316\u7684\u63a2\u9488\u8bed\u53e5\u6267\u884c\u4e86 20 \u6b21&#xff0c;\u7f13\u5b58\u6761\u76ee\u5e94\u3010\u8fdc\u5c11\u4e8e\u301120\u3002<br \/>\n     &#xff08;\u540c\u65f6\u7528 LIKE \u9650\u5b9a\u5230\u672c\u811a\u672c\u7684\u63a2\u9488\u6807\u8bb0&#xff0c;\u907f\u514d\u7edf\u8ba1\u5230\u65e0\u5173\u8bed\u53e5&#xff09;*\/<br \/>\nDECLARE &#064;reuseCnt int &#061;<br \/>\n    (SELECT COUNT(*) FROM sys.dm_exec_cached_plans cp<br \/>\n     CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) t<br \/>\n     WHERE t.text LIKE N&#039;%dyn_cache_probe_B%&#039;);<br \/>\nIF &#064;reuseCnt BETWEEN 1 AND 5<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1;<br \/>\n      PRINT N&#039;  V9  \u2713 \u53c2\u6570\u5316\u8ba1\u5212\u590d\u7528&#xff08;20 \u6b21\u6267\u884c \u2192 &#039; &#043; CAST(&#064;reuseCnt AS nvarchar(5)) &#043; N&#039; \u4efd\u8ba1\u5212&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1;<br \/>\n      PRINT N&#039;  V9  \u2717 \u53c2\u6570\u5316\u590d\u7528\u5f02\u5e38&#xff1a;\u6761\u76ee\u6570 &#061; &#039; &#043; CAST(&#064;reuseCnt AS nvarchar(5)); END<\/p>\n<p>\/* &#8212; V10&#xff1a;\u5ba1\u8ba1\u65e5\u5fd7\u5df2\u8bb0\u5f55 &#8212; *\/<br \/>\nDECLARE &#064;logCnt int &#061; (SELECT COUNT(*) FROM dbo.Dyn_SearchLog);<br \/>\nIF &#064;logCnt &gt; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V10 \u2713 \u5ba1\u8ba1\u65e5\u5fd7\u5df2\u8bb0\u5f55 &#039; &#043; CAST(&#064;logCnt AS nvarchar(5)) &#043; N&#039; \u6761&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V10 \u2717 \u5ba1\u8ba1\u65e5\u5fd7\u4e3a\u7a7a&#039;; END<\/p>\n<p>\/* &#8212; V11&#xff1a;\u5ba1\u8ba1\u65e5\u5fd7\u4e2d\u6355\u83b7\u5230\u4e86\u6ce8\u5165\u8f7d\u8377 &#8212; *\/<br \/>\nDECLARE &#064;evilCnt int &#061;<br \/>\n    (SELECT COUNT(*) FROM dbo.Dyn_SearchLog<br \/>\n     WHERE FilterJson LIKE N&#039;%&#8211;%&#039; OR FilterJson LIKE N&#039;%DROP%&#039; OR FilterJson LIKE N&#039;%OR 1&#061;1%&#039;);<br \/>\nIF &#064;evilCnt &gt; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V11 \u2713 \u5ba1\u8ba1\u6355\u83b7\u5230 &#039; &#043; CAST(&#064;evilCnt AS nvarchar(5)) &#043; N&#039; \u6761\u53ef\u7591\u8f93\u5165&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V11 \u2717 \u672a\u6355\u83b7\u5230\u53ef\u7591\u8f93\u5165&#xff08;\u7b2c 04 \u8282\u7684\u6ce8\u5165\u8f7d\u8377\u5e94\u88ab\u8bb0\u5f55&#xff09;&#039;; END<\/p>\n<p>\/* &#8212; V12&#xff1a;\u6743\u9650\u6f14\u793a\u5bf9\u8c61\u5df2\u6e05\u7406\u5e72\u51c0 &#8212; *\/<br \/>\nDECLARE &#064;leftover int &#061; (<br \/>\n    (SELECT COUNT(*) FROM sys.database_principals WHERE name IN (N&#039;u_Dyn_TestUser&#039;, N&#039;u_Dyn_CertReader&#039;))<br \/>\n  &#043; (SELECT COUNT(*) FROM sys.certificates WHERE name &#061; N&#039;Cert_Dyn_SignedReader&#039;)<br \/>\n  &#043; (SELECT COUNT(*) FROM sys.objects WHERE name IN<br \/>\n        (N&#039;usp_Dyn_SignedRead&#039;, N&#039;usp_Dyn_SignedRead_Dyn&#039;, N&#039;usp_Dyn_SignedRead_Dyn2&#039;, N&#039;usp_Dyn_SniffDemo&#039;, N&#039;usp_Dyn_Demo_Injection&#039;)));<br \/>\nIF &#064;leftover &#061; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V12 \u2713 \u6743\u9650\u6f14\u793a\u5bf9\u8c61\u5df2\u5168\u90e8\u6e05\u7406&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V12 \u2717 \u4ecd\u6709 &#039; &#043; CAST(&#064;leftover AS nvarchar(5)) &#043; N&#039; \u4e2a\u6b8b\u7559\u5bf9\u8c61&#039;; END<\/p>\n<p>\/* &#8212; V13&#xff1a;\u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5b58\u5728&#xff08;\u6a21\u5757\u7b7e\u540d\u6240\u9700&#xff09;&#8212; *\/<br \/>\nIF EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name &#061; N&#039;##MS_DatabaseMasterKey##&#039;)<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V13 \u2713 \u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u5b58\u5728&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V13 \u2717 \u6570\u636e\u5e93\u4e3b\u5bc6\u94a5\u7f3a\u5931&#039;; END<\/p>\n<p>\/* &#8212; V14&#xff1a;erp.SalesOrder \u57fa\u7840\u6570\u636e\u89c4\u6a21\u7b26\u5408\u9884\u671f &#8212; *\/<br \/>\nDECLARE &#064;soCnt int &#061; (SELECT COUNT(*) FROM erp.SalesOrder);<br \/>\nIF &#064;soCnt &#061; 6000<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V14 \u2713 erp.SalesOrder \u884c\u6570\u6b63\u786e&#xff08;6000&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V14 \u2717 erp.SalesOrder \u884c\u6570\u5f02\u5e38&#xff1a;&#039; &#043; CAST(&#064;soCnt AS nvarchar(10)); END<\/p>\n<p>\/* &#8212; V15&#xff1a;sp_executesql \u8f93\u51fa\u53c2\u6570\u53ef\u7528 &#8212; *\/<br \/>\nDECLARE &#064;sumV15 decimal(18,2);<br \/>\nDECLARE &#064;sqlV15 nvarchar(500) &#061;<br \/>\n    N&#039;SELECT &#064;s &#061; SUM(NetAmountUsd) FROM erp.SalesOrder WHERE CountryCode &#061; &#064;cc;&#039;;<br \/>\nEXEC sys.sp_executesql &#064;sqlV15, N&#039;&#064;s decimal(18,2) OUTPUT, &#064;cc char(2)&#039;,<br \/>\n     &#064;s &#061; &#064;sumV15 OUTPUT, &#064;cc &#061; N&#039;FR&#039;;<br \/>\nIF &#064;sumV15 &gt; 0<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V15 \u2713 \u8f93\u51fa\u53c2\u6570\u6b63\u5e38&#xff08;FR \u5408\u8ba1 &#061; &#039; &#043; CAST(&#064;sumV15 AS nvarchar(30)) &#043; N&#039;&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V15 \u2717 \u8f93\u51fa\u53c2\u6570\u5f02\u5e38&#039;; END<\/p>\n<p>\/* &#8212; V16&#xff1a;\u52a8\u6001 SQL \u65e0\u6cd5\u8bbf\u95ee\u5916\u5c42\u8868\u53d8\u91cf&#xff08;\u590d\u73b0 1087&#xff0c;\u786e\u8ba4\u89c4\u5219\u6210\u7acb&#xff09;&#8212; *\/<br \/>\nDECLARE &#064;tblVar table (x int);<br \/>\nINSERT INTO &#064;tblVar (x) VALUES (1);<br \/>\nDECLARE &#064;v16Ok bit &#061; 0;<br \/>\nBEGIN TRY<br \/>\n    EXEC sys.sp_executesql N&#039;SELECT * FROM &#064;tblVar;&#039;;<br \/>\nEND TRY<br \/>\nBEGIN CATCH<br \/>\n    IF ERROR_NUMBER() &#061; 1087 SET &#064;v16Ok &#061; 1;<br \/>\nEND CATCH<br \/>\nIF &#064;v16Ok &#061; 1<br \/>\nBEGIN SET &#064;pass &#043;&#061; 1; PRINT N&#039;  V16 \u2713 \u786e\u8ba4\u89c4\u5219&#xff1a;\u52a8\u6001 SQL \u770b\u4e0d\u5230\u5916\u5c42\u8868\u53d8\u91cf&#xff08;1087&#xff09;&#039;; END<br \/>\nELSE BEGIN SET &#064;fail &#043;&#061; 1; PRINT N&#039;  V16 \u2717 \u9884\u671f 1087 \u672a\u51fa\u73b0&#xff0c;\u89c4\u5219\u53ef\u80fd\u5df2\u53d8\u5316&#039;; END<\/p>\n<p>\/* &#8212; \u6c47\u603b &#8212; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<br \/>\nPRINT N&#039;  \u81ea\u9a8c\u8bc1\u7ed3\u679c&#xff1a;&#039; &#043; CAST(&#064;pass AS nvarchar(5)) &#043; N&#039; \u901a\u8fc7 \/ &#039;<br \/>\n    &#043; CAST(&#064;fail AS nvarchar(5)) &#043; N&#039; \u5931\u8d25&#xff08;\u5171 16 \u9879&#xff09;&#039;;<br \/>\nPRINT N&#039;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&#039;;<\/p>\n<p>\/* &#8212; \u5199\u5165\u6821\u9a8c\u8868 &#8212; *\/<br \/>\nDELETE FROM dbo.Dyn_ResultCheck WHERE CheckKey &#061; N&#039;V_SUMMARY&#039;;<br \/>\nINSERT INTO dbo.Dyn_ResultCheck (CheckKey, CheckValue)<br \/>\nVALUES (N&#039;V_SUMMARY&#039;, CAST(&#064;pass AS nvarchar(5)) &#043; N&#039; pass \/ &#039; &#043; CAST(&#064;fail AS nvarchar(5)) &#043; N&#039; fail&#039;);<\/p>\n<p>IF &#064;fail &#061; 0<br \/>\n    PRINT N&#039;  \u2605 \u5168\u90e8\u901a\u8fc7 \u2014\u2014 \u672c\u673a\u73af\u5883\u4e0e\u811a\u672c\u6587\u6863\u4e00\u81f4&#xff0c;\u6240\u6709\u7ed3\u8bba\u5747\u5df2\u5b9e\u6d4b\u786e\u8ba4\u3002&#039;;<br \/>\nELSE<br \/>\n    PRINT N&#039;  \u26a0 \u5b58\u5728\u5931\u8d25\u9879&#xff0c;\u8bf7\u68c0\u67e5\u4e0a\u65b9 V1~V16 \u660e\u7ec6\u3002&#039;;<br \/>\nGO<\/p>\n<p>\/* &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n   \u301012\u3011\u6536\u5c3e<br \/>\n   &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; *\/<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;\u301012\u3011\u4e00\u53e5\u8bdd\u603b\u7ed3&#039;;<br \/>\nPRINT N&#039;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550&#039;;<br \/>\nPRINT N&#039;    \u52a8\u6001 SQL \u7684\u5b89\u5168 &#061; \u8ba9&#034;\u503c&#034;\u8d70\u53c2\u6570 &#043; \u8ba9&#034;\u7ed3\u6784&#034;\u8d70\u767d\u540d\u5355\u3002&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u503c    \u2192 sp_executesql \u5f3a\u7c7b\u578b\u53c2\u6570&#xff08;\u7b2c 01 \/ 03 \u8282&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u7ed3\u6784  \u2192 \u767d\u540d\u5355\u6620\u5c04 &#043; QUOTENAME&#xff08;\u7b2c 05 \u8282&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u515c\u5e95  \u2192 \u6700\u5c0f\u6743\u9650 \/ \u6a21\u5757\u7b7e\u540d&#xff08;\u7b2c 06 \u8282&#xff09;&#039;;<br \/>\nPRINT N&#039;      \u00b7 \u89c4\u6a21  \u2192 \u952e\u96c6\u5206\u9875 &#043; \u5206\u533a\u88c1\u526a &#043; \u8ba1\u5212\u590d\u7528&#xff08;\u7b2c 07 \/ 08 \u8282&#xff09;&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;    \u8bb0\u4f4f\u4e00\u53e5\u8bdd&#xff1a;&#039;;<br \/>\nPRINT N&#039;      \u9759\u6001 SQL \u80fd\u505a\u5230\u7684&#xff0c;\u7edd\u4e0d\u7528\u52a8\u6001 SQL&#xff1b;&#039;;<br \/>\nPRINT N&#039;      \u5fc5\u987b\u52a8\u6001\u65f6&#xff0c;\u51e1\u662f&#034;\u503c&#034;\u4e00\u5f8b\u53c2\u6570\u5316&#xff0c;\u51e1\u662f&#034;\u7ed3\u6784&#034;\u4e00\u5f8b\u767d\u540d\u5355\u3002&#039;;<br \/>\nPRINT N&#039;&#039;;<br \/>\nPRINT N&#039;    \u2605 \u672c\u811a\u672c\u5168\u90e8\u7ed3\u8bba\u5747\u5728 SQL Server 2025 (17.0.1135.8) Enterprise \u4e0a\u5b9e\u6d4b\u786e\u8ba4\u3002&#039;;<br \/>\nPRINT N&#039;###################################################################&#039;;<br \/>\nPRINT N&#039;##  \u811a\u672c\u6267\u884c\u5b8c\u6bd5&#039;;<br \/>\nPRINT N&#039;###################################################################&#039;;<br \/>\nPRINT N&#039;  ? \u5168\u8fc7\u7a0b 12 \u8282\u6267\u884c\u5b8c\u6210\u3002\u82e5\u7b2c 11 \u8282\u663e\u793a&#034;16 \u901a\u8fc7 \/ 0 \u5931\u8d25&#034;&#xff0c;\u5219\u672c\u673a\u73af\u5883\u4e0e\u6587\u6863\u4e00\u81f4\u3002&#039;;<br \/>\nGO<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\/* SQL Server 2025 \u2014 \u52a8\u6001 SQL \u6784\u5efa&#xff1a;\u6280\u672f\u3001\u5b89\u5168\u4e0e\u6700\u4f73\u5b9e\u8df5Dynamic Query Building in SQL: Techniques, Security, and Best Practices&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;\u4e3b\u9898&#xff1a;\u7528\u53c2\u6570\u5316\u67e5\u8be2\u3001\u5b58\u50a8\u8fc7\u7a0b\u3001\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668\u4e0e\u6ce8\u5165\u9632\u62a4&#xff0c;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[768,538,100,4949],"topic":[],"class_list":["post-113726","post","type-post","status-publish","format-standard","hentry","category-server","tag-sql","tag-sqlserver","tag-100","tag-4949"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/113726.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\/* SQL Server 2025 \u2014 \u52a8\u6001 SQL \u6784\u5efa&#xff1a;\u6280\u672f\u3001\u5b89\u5168\u4e0e\u6700\u4f73\u5b9e\u8df5Dynamic Query Building in SQL: Techniques, Security, and Best Practices--------------------------------------------------------------------------------\u4e3b\u9898&#xff1a;\u7528\u53c2\u6570\u5316\u67e5\u8be2\u3001\u5b58\u50a8\u8fc7\u7a0b\u3001\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668\u4e0e\u6ce8\u5165\u9632\u62a4&#xff0c;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/113726.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-07T00:49:16+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"53 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/113726.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/113726.html\",\"name\":\"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-07T00:49:16+00:00\",\"dateModified\":\"2026-10-07T00:49:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/113726.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/113726.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/113726.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/113726.html","og_locale":"zh_CN","og_type":"article","og_title":"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\/* SQL Server 2025 \u2014 \u52a8\u6001 SQL \u6784\u5efa&#xff1a;\u6280\u672f\u3001\u5b89\u5168\u4e0e\u6700\u4f73\u5b9e\u8df5Dynamic Query Building in SQL: Techniques, Security, and Best Practices--------------------------------------------------------------------------------\u4e3b\u9898&#xff1a;\u7528\u53c2\u6570\u5316\u67e5\u8be2\u3001\u5b58\u50a8\u8fc7\u7a0b\u3001\u8fd0\u884c\u65f6\u8fc7\u6ee4\u5668\u4e0e\u6ce8\u5165\u9632\u62a4&#xff0c;","og_url":"https:\/\/www.wsisp.com\/helps\/113726.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-07T00:49:16+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"53 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/113726.html","url":"https:\/\/www.wsisp.com\/helps\/113726.html","name":"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-07T00:49:16+00:00","dateModified":"2026-10-07T00:49:16+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/113726.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/113726.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/113726.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"sql: Dynamic Query Building in SQL: Techniques, Security, and Best Practices using sql server 2025"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/113726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=113726"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/113726\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=113726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=113726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=113726"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=113726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}