<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>הבלוג של גרי רשף</title>
	<atom:link href="http://gerireshef.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://gerireshef.wordpress.com</link>
	<description>Databases, SQL Server, BI, Misc</description>
	<lastBuildDate>Tue, 24 Jan 2012 19:06:47 +0000</lastBuildDate>
	<language>he</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='gerireshef.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/95ca86981183f4e0bb840dc55d8d5928?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>הבלוג של גרי רשף</title>
		<link>http://gerireshef.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://gerireshef.wordpress.com/osd.xml" title="הבלוג של גרי רשף" />
	<atom:link rel='hub' href='http://gerireshef.wordpress.com/?pushpress=hub'/>
		<item>
		<title>השפעת האינדקסים על חיפוש פשוט בטבלה</title>
		<link>http://gerireshef.wordpress.com/2012/01/24/%d7%94%d7%a9%d7%a4%d7%a2%d7%aa-%d7%94%d7%90%d7%99%d7%a0%d7%93%d7%a7%d7%a1%d7%99%d7%9d-%d7%a2%d7%9c-%d7%97%d7%99%d7%a4%d7%95%d7%a9-%d7%a4%d7%a9%d7%95%d7%98-%d7%91%d7%98%d7%91%d7%9c%d7%94/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/24/%d7%94%d7%a9%d7%a4%d7%a2%d7%aa-%d7%94%d7%90%d7%99%d7%a0%d7%93%d7%a7%d7%a1%d7%99%d7%9d-%d7%a2%d7%9c-%d7%97%d7%99%d7%a4%d7%95%d7%a9-%d7%a4%d7%a9%d7%95%d7%98-%d7%91%d7%98%d7%91%d7%9c%d7%94/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 19:06:44 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://gerireshef.wordpress.com/?p=1450</guid>
		<description><![CDATA[פוסט זה מתפרסם בכתובת המעודכנת של הבלוג.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1450&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><a href="http://blogs.microsoft.co.il/blogs/gerireshef/archive/2012/01/24/996539.aspx">פוסט זה מתפרסם בכתובת המעודכנת של הבלוג.</a></h3>
<div></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1450/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1450&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/24/%d7%94%d7%a9%d7%a4%d7%a2%d7%aa-%d7%94%d7%90%d7%99%d7%a0%d7%93%d7%a7%d7%a1%d7%99%d7%9d-%d7%a2%d7%9c-%d7%97%d7%99%d7%a4%d7%95%d7%a9-%d7%a4%d7%a9%d7%95%d7%98-%d7%91%d7%98%d7%91%d7%9c%d7%94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>
	</item>
		<item>
		<title>ריבוי תנאים הפונים לאותו אובייקט</title>
		<link>http://gerireshef.wordpress.com/2012/01/22/%d7%a8%d7%99%d7%91%d7%95%d7%99-%d7%aa%d7%a0%d7%90%d7%99%d7%9d-%d7%94%d7%a4%d7%95%d7%a0%d7%99%d7%9d-%d7%9c%d7%90%d7%95%d7%aa%d7%95-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/22/%d7%a8%d7%99%d7%91%d7%95%d7%99-%d7%aa%d7%a0%d7%90%d7%99%d7%9d-%d7%94%d7%a4%d7%95%d7%a0%d7%99%d7%9d-%d7%9c%d7%90%d7%95%d7%aa%d7%95-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 19:18:40 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://gerireshef.wordpress.com/?p=1448</guid>
		<description><![CDATA[פוסט זה מתפרסם בכתובת המעודכנת של הבלוג.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1448&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.microsoft.co.il/blogs/gerireshef/archive/2012/01/22/994995.aspx">פוסט זה מתפרסם בכתובת המעודכנת של הבלוג.</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1448/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1448/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1448/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1448&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/22/%d7%a8%d7%99%d7%91%d7%95%d7%99-%d7%aa%d7%a0%d7%90%d7%99%d7%9d-%d7%94%d7%a4%d7%95%d7%a0%d7%99%d7%9d-%d7%9c%d7%90%d7%95%d7%aa%d7%95-%d7%90%d7%95%d7%91%d7%99%d7%99%d7%a7%d7%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>
	</item>
		<item>
		<title>הבלוג משנה כתובת</title>
		<link>http://gerireshef.wordpress.com/2012/01/21/%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%9e%d7%a9%d7%a0%d7%94-%d7%9b%d7%aa%d7%95%d7%91%d7%aa/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/21/%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%9e%d7%a9%d7%a0%d7%94-%d7%9b%d7%aa%d7%95%d7%91%d7%aa/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 19:20:40 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1446</guid>
		<description><![CDATA[הבלוג הזה נולד לפני כשנתיים. לפני כשנה התחלתי לפרסם את הפוסטים במקביל במיקרוסופט, וכעת העברתי לשם את כל הפעילות- כולל כל הפוסטים שהתפרסמו במהלך השנה הראשונה בה כתבתי רק כאן. מכיוון שמדובר רק בשינוי כתובת ולא בפרידה- אין צורך בנאומים.. כנראה שאמשיך לפרסם כאן – לפחות בהתחלה – קישורים לפוסטים בבלוג הקבוע, בעיקר עבור אלו [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1446&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>הבלוג הזה נולד לפני כשנתיים.    <br />לפני כשנה התחלתי לפרסם את הפוסטים במקביל ב<a href="http://blogs.microsoft.co.il/blogs/gerireshef/">מיקרוסופט</a>,     <br />וכעת העברתי לשם את כל הפעילות- כולל כל הפוסטים שהתפרסמו במהלך השנה הראשונה בה כתבתי רק כאן.     <br />מכיוון שמדובר רק בשינוי כתובת ולא בפרידה- אין צורך בנאומים.. <img style="border-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://gerireshef.files.wordpress.com/2012/01/wlemoticon-smile.png" />     <br />כנראה שאמשיך לפרסם כאן – לפחות בהתחלה – קישורים לפוסטים בבלוג הקבוע, בעיקר עבור אלו שרשומים לעדכונים מכאן או שקוראים באופן סמוי ואין לי דרך לומר להם אישית שאני עובר..</p>
<p dir="ltr" align="center"><a href="http://blogs.microsoft.co.il/blogs/gerireshef/"><font size="5">http://blogs.microsoft.co.il/blogs/gerireshef/</font></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1446/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1446/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1446/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1446&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/21/%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%9e%d7%a9%d7%a0%d7%94-%d7%9b%d7%aa%d7%95%d7%91%d7%aa/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/wlemoticon-smile.png" medium="image">
			<media:title type="html">Smile</media:title>
		</media:content>
	</item>
		<item>
		<title>ישום היררכיה (עץ) בעזרת מספרים ראשוניים</title>
		<link>http://gerireshef.wordpress.com/2012/01/17/%d7%99%d7%a9%d7%95%d7%9d-%d7%94%d7%99%d7%a8%d7%a8%d7%9b%d7%99%d7%94-%d7%a2%d7%a5-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%9e%d7%a1%d7%a4%d7%a8%d7%99%d7%9d-%d7%a8%d7%90%d7%a9%d7%95%d7%a0%d7%99%d7%99%d7%9d/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/17/%d7%99%d7%a9%d7%95%d7%9d-%d7%94%d7%99%d7%a8%d7%a8%d7%9b%d7%99%d7%94-%d7%a2%d7%a5-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%9e%d7%a1%d7%a4%d7%a8%d7%99%d7%9d-%d7%a8%d7%90%d7%a9%d7%95%d7%a0%d7%99%d7%99%d7%9d/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 19:04:57 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1440</guid>
		<description><![CDATA[הפוסט להלן מציג דרך לממש עץ בעזרת מספרים ראשוניים, תוך שימוש בתכונה שכל מספר יכול להיות מיוצג כמכפלה של מספרים ראשוניים (על ידי פירוק לגורמים). עץ בתורת הגרפים מוגדר כגרף מכוון בו לכל קודקוד יש לכל היותר קודקוד אחד שמחובר אליו בקשת, והוא יכול לתאר מבנים או תהליכים שונים: 1. מערכת היררכית בארגון בה לכל [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1440&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>הפוסט להלן מציג דרך לממש עץ בעזרת מספרים ראשוניים, תוך שימוש בתכונה שכל מספר יכול להיות מיוצג כמכפלה של מספרים ראשוניים (על ידי פירוק לגורמים).<br />
עץ בתורת הגרפים מוגדר כגרף מכוון בו לכל קודקוד יש לכל היותר קודקוד אחד שמחובר אליו בקשת,<br />
והוא יכול לתאר מבנים או תהליכים שונים:<br />
1. מערכת היררכית בארגון בה לכל אחד יש מנהל אליו הוא כפוף (זולת המנהל הבכיר ביותר), אם כי למנהל יכולים להיות כפופים מספר עובדים.<br />
2. מבנה דוח כספי מורכב. למשל- מאזן מחולק לנכסים ולהתחייבויות והון עצמי; ההתחייבויות מחולקות להתחייבויות לזמן קצר ולזמן ארוך; התחייבויות לזמן קצר כוללות לקוחות, שכר עובדים, וכך הלאה.<br />
3. חלוקה של מערכת החי לסוגים, מינים, משפחות וכו'.<br />
4. משחק כדוגמת שחמט בו לשחקן הפותח (הלבן) יש 20 אפשרויות שונות כיצד ללכת, לשחקן השני (השחור) יש מספר תגובות אפשריות לכל צעד של הלבן, וכך הלאה (זהו עץ בעל מימדים אסטרונומיים, אך עדיין- עץ).<br />
5. מערכת מחיצות, מחיצות משנה, וקבצים בדיסק.<br />
פעם שמעתי הצעה להשתמש במונח &quot;אילן&quot; במקום במונח &quot;עץ&quot; כתרגום ל-Tree בתורת הגרפים מכיוון שהמילה עץ כבר יוחדה לחומר עץ (Wood) ולכן לא ראוי להעמיס עליה משמעות נוספת, אך ההצעה לא התקבלה וחבל.</p>
<p>המימוש הטבעי לעץ בדטבייס רלציוני הוא בעזת טבלה המקושרת לעצמה ביחס של 1:N (אחת לרבים): בכל שורה המציינת עובד (בהתייחס לדוגמה 1 הנ&quot;ל) יש עמודת מנהל, ועמודת המפתח מקושרת לעמודה זו שכן למנהל שצויין בה יש שורה משלו בה ניתן למצוא פרטים עליו ועל המנהל שלו עצמו.<br />
מימוש זה נוח מבחינת הזנת נתונים ועדכון עובדים ספציפיים- מציינים לכל עובד מי המנהל שלו, וכשמנהל מתחלף- מעדכנים את עמודת המנהל של כל העובדים שבעמודת המנהל שלהם מופיע הקודם.<br />
החסרון שלו הוא בשליפה חלקים מהעץ: כל העובדים הכפופים במישרין או בעקיפין למנהל מסויים, כל &quot;שרשרת הפיקוד&quot; אליה כפוף עובד מסויים, עדכון שכר במחלקה מסויימת וכו'. פעולות אלו דורשות שימוש ברקורסיה והן עלולות להיות כבדות מאוד בשימוש שוטף.<br />
כתוצאה מכך החלו לחפש פתרונות חלופיים שיאפשרו למצוא בקלות את מקומו של כל קודקוד (=עובד) בעץ וכך לחסוך את השימוש ברקורסיה.<br />
דוגמה לפתרון כזה הוא שימוש בסדרות מקוננות (Nested Sets) כפי ש<a href="http://blogs.microsoft.co.il/blogs/nayatech/archive/2012/01/02/nested-sets-sql-server.aspx">צחי פניגשטיין</a> כתב לאחרונה. בשיטה זו המתבססת על תורת הקבוצות &#8211; כל שורה מיוצגת על ידי ערך ימני R וערך שמאלי L המציינים תחום (R&lt;L), שהוא עצמו נמצא בתוך התחום של המנהל של אותה שורה (=עובד). כך קל לאתר את כל העובדים של מנהל מסויים (נמצאים בתוך התחום שלו) או את כל המנהלים של עובד מסויים (הוא נמצא בתחום שלהם), אם כי קביעת התחומים ותחזוקתם לאור שינויים במבנה הארגוני- יוצרים בעיות מורכבות שהיו נפתרות בקלות בשיטה הישנה.<br />
&quot;הווה מחשב שכר מצווה כנגד הפסדה&quot; פסקו חז&quot;ל, וכך גם אנחנו במקרה זה.<br />
פתרון אחר הוא שימוש ב-HierarchyID שקיים החל מגרסה 2008. מדובר בסוג נתון המתבסס על CLR, והוא שומר בתוכו את ההיררכיה שמעל כל עובד (כלומר- המנהלים שלו). סוג נתון זה מגיע עם מערכת מתודות קיימת שמאפשרת בקלות למצוא מי כפוף למי, לבצע שינויים וכו'; ועל כך כתב לאחרונה <a href="http://www.madeira.co.il/the-new-data-type-hierarchyid-is-one-of-the-coolest-and-fantastic-new-features-of-sql-server-2008/">אסף אביב</a>.<br />
השימוש ב-<a href="http://gerireshef.wordpress.com/2011/12/22/filetable-%d7%91-sql-server-2012/">FileTable</a> החל מגרסת 2012 מתבסס על שימוש ב-HierarchyID, וכפי שציינתי- למערכת המחיצות בדיסק יש מבנה של עץ.</p>
<p>הפוסט להלן מציג פתרון שדומה בגישה שלו לזה של ה-HierarchyID (בכל שורה שמור מידע לגבי &quot;שרשרת הפיקוד&quot; מעליה): לכל שורה בטבלה נתאים מספר ראשוני בעמודה אחת, ונציין את מכפלת המספרים הראשוניים שמעליו בעמודה אחרת. אם נקפיד שכל מספר ראשוני יהיה גדול מזה שמעליו- הפירוק לגורמים של כל מכפלה יחזיר סדרת מספרים ראשוניים שיציינו את המנהלים של אותו עובד מהקטן (המנהל הבכיר) לגדול (המנהל הזוטר הישיר).<br />
למשל- לעובד גרי מצויין בעמודה אחת המספר הראשוני 53, ובעמודה אחרת המכפלה 627=3*11*19 המציינת שהמנהל הישיר של גרי הוא זה שהראשוני שלו 19 והמכפלה שלו 33=3*11, המנהל שמעליו הוא זה שהראשוני שלו 11 והמכפלה שלו 3, והמנהל הבכיר ביותר הוא זה שהראשוני שלו 3 והמכפלה 1 (הערך ההתחלתי).<br />
לכל העובדים הכפופים לגרי תהיה מכפלה 33231=627*53=3*11*19*53, ומספרים ראשוניים גדולים מ-53.</p>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image0011.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image001" src="http://gerireshef.files.wordpress.com/2012/01/clip_image001_thumb1.gif?w=588&#038;h=774" alt="clip_image001" width="588" height="774" border="0" /></a><br />
נצטרך להחזיק טבלת מספרים ראשוניים בת 10,000 מספרים שאמורה להספיק לרוב הצרכים המעשיים, ולצידה המגבלה של עמודת המכפלה שהיא מסוג BigInt שיכול להגיע לתשעת אלפים מליוני מליארד בערך..<br />
בדקתי את המערכת שלהלן עם טבלה בת יותר מעשרה מליון שורות, ולא הייתה כל בעייה.</p>
<p>ניצור קודם כל את טבלת המספרים הראשוניים (מטעמי יעילות- נאנדקס אותה רק לאחר שתתמלא):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">If</span> Object_Id(<span style="color:#006080;">'T_Primes'</span>,<span style="color:#006080;">'U'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> T_Primes;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @S <span style="color:#0000ff;">Varchar</span>(<span style="color:#0000ff;">Max</span>)=<span style="color:#006080;">'2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007,10009,10037,10039,10061,10067,10069,10079,10091,10093,10099,10103,10111,10133,10139,10141,10151,10159,10163,10169,10177,10181,10193,10211,10223,10243,10247,10253,10259,10267,10271,10273,10289,10301,10303,10313,10321,10331,10333,10337,10343,10357,10369,10391,10399,10427,10429,10433,10453,10457,10459,10463,10477,10487,10499,10501,10513,10529,10531,10559,10567,10589,10597,10601,10607,10613,10627,10631,10639,10651,10657,10663,10667,10687,10691,10709,10711,10723,10729,10733,10739,10753,10771,10781,10789,10799,10831,10837,10847,10853,10859,10861,10867,10883,10889,10891,10903,10909,10937,10939,10949,10957,10973,10979,10987,10993,11003,11027,11047,11057,11059,11069,11071,11083,11087,11093,11113,11117,11119,11131,11149,11159,11161,11171,11173,11177,11197,11213,11239,11243,11251,11257,11261,11273,11279,11287,11299,11311,11317,11321,11329,11351,11353,11369,11383,11393,11399,11411,11423,11437,11443,11447,11467,11471,11483,11489,11491,11497,11503,11519,11527,11549,11551,11579,11587,11593,11597,11617,11621,11633,11657,11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,11779,11783,11789,11801,11807,11813,11821,11827,11831,11833,11839,11863,11867,11887,11897,11903,11909,11923,11927,11933,11939,11941,11953,11959,11969,11971,11981,11987,12007,12011,12037,12041,12043,12049,12071,12073,12097,12101,12107,12109,12113,12119,12143,12149,12157,12161,12163,12197,12203,12211,12227,12239,12241,12251,12253,12263,12269,12277,12281,12289,12301,12323,12329,12343,12347,12373,12377,12379,12391,12401,12409,12413,12421,12433,12437,12451,12457,12473,12479,12487,12491,12497,12503,12511,12517,12527,12539,12541,12547,12553,12569,12577,12583,12589,12601,12611,12613,12619,12637,12641,12647,12653,12659,12671,12689,12697,12703,12713,12721,12739,12743,12757,12763,12781,12791,12799,12809,12821,12823,12829,12841,12853,12889,12893,12899,12907,12911,12917,12919,12923,12941,12953,12959,12967,12973,12979,12983,13001,13003,13007,13009,13033,13037,13043,13049,13063,13093,13099,13103,13109,13121,13127,13147,13151,13159,13163,13171,13177,13183,13187,13217,13219,13229,13241,13249,13259,13267,13291,13297,13309,13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,13417,13421,13441,13451,13457,13463,13469,13477,13487,13499,13513,13523,13537,13553,13567,13577,13591,13597,13613,13619,13627,13633,13649,13669,13679,13681,13687,13691,13693,13697,13709,13711,13721,13723,13729,13751,13757,13759,13763,13781,13789,13799,13807,13829,13831,13841,13859,13873,13877,13879,13883,13901,13903,13907,13913,13921,13931,13933,13963,13967,13997,13999,14009,14011,14029,14033,14051,14057,14071,14081,14083,14087,14107,14143,14149,14153,14159,14173,14177,14197,14207,14221,14243,14249,14251,14281,14293,14303,14321,14323,14327,14341,14347,14369,14387,14389,14401,14407,14411,14419,14423,14431,14437,14447,14449,14461,14479,14489,14503,14519,14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,14621,14627,14629,14633,14639,14653,14657,14669,14683,14699,14713,14717,14723,14731,14737,14741,14747,14753,14759,14767,14771,14779,14783,14797,14813,14821,14827,14831,14843,14851,14867,14869,14879,14887,14891,14897,14923,14929,14939,14947,14951,14957,14969,14983,15013,15017,15031,15053,15061,15073,15077,15083,15091,15101,15107,15121,15131,15137,15139,15149,15161,15173,15187,15193,15199,15217,15227,15233,15241,15259,15263,15269,15271,15277,15287,15289,15299,15307,15313,15319,15329,15331,15349,15359,15361,15373,15377,15383,15391,15401,15413,15427,15439,15443,15451,15461,15467,15473,15493,15497,15511,15527,15541,15551,15559,15569,15581,15583,15601,15607,15619,15629,15641,15643,15647,15649,15661,15667,15671,15679,15683,15727,15731,15733,15737,15739,15749,15761,15767,15773,15787,15791,15797,15803,15809,15817,15823,15859,15877,15881,15887,15889,15901,15907,15913,15919,15923,15937,15959,15971,15973,15991,16001,16007,16033,16057,16061,16063,16067,16069,16073,16087,16091,16097,16103,16111,16127,16139,16141,16183,16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,16273,16301,16319,16333,16339,16349,16361,16363,16369,16381,16411,16417,16421,16427,16433,16447,16451,16453,16477,16481,16487,16493,16519,16529,16547,16553,16561,16567,16573,16603,16607,16619,16631,16633,16649,16651,16657,16661,16673,16691,16693,16699,16703,16729,16741,16747,16759,16763,16787,16811,16823,16829,16831,16843,16871,16879,16883,16889,16901,16903,16921,16927,16931,16937,16943,16963,16979,16981,16987,16993,17011,17021,17027,17029,17033,17041,17047,17053,17077,17093,17099,17107,17117,17123,17137,17159,17167,17183,17189,17191,17203,17207,17209,17231,17239,17257,17291,17293,17299,17317,17321,17327,17333,17341,17351,17359,17377,17383,17387,17389,17393,17401,17417,17419,17431,17443,17449,17467,17471,17477,17483,17489,17491,17497,17509,17519,17539,17551,17569,17573,17579,17581,17597,17599,17609,17623,17627,17657,17659,17669,17681,17683,17707,17713,17729,17737,17747,17749,17761,17783,17789,17791,17807,17827,17837,17839,17851,17863,17881,17891,17903,17909,17911,17921,17923,17929,17939,17957,17959,17971,17977,17981,17987,17989,18013,18041,18043,18047,18049,18059,18061,18077,18089,18097,18119,18121,18127,18131,18133,18143,18149,18169,18181,18191,18199,18211,18217,18223,18229,18233,18251,18253,18257,18269,18287,18289,18301,18307,18311,18313,18329,18341,18353,18367,18371,18379,18397,18401,18413,18427,18433,18439,18443,18451,18457,18461,18481,18493,18503,18517,18521,18523,18539,18541,18553,18583,18587,18593,18617,18637,18661,18671,18679,18691,18701,18713,18719,18731,18743,18749,18757,18773,18787,18793,18797,18803,18839,18859,18869,18899,18911,18913,18917,18919,18947,18959,18973,18979,19001,19009,19013,19031,19037,19051,19069,19073,19079,19081,19087,19121,19139,19141,19157,19163,19181,19183,19207,19211,19213,19219,19231,19237,19249,19259,19267,19273,19289,19301,19309,19319,19333,19373,19379,19381,19387,19391,19403,19417,19421,19423,19427,19429,19433,19441,19447,19457,19463,19469,19471,19477,19483,19489,19501,19507,19531,19541,19543,19553,19559,19571,19577,19583,19597,19603,19609,19661,19681,19687,19697,19699,19709,19717,19727,19739,19751,19753,19759,19763,19777,19793,19801,19813,19819,19841,19843,19853,19861,19867,19889,19891,19913,19919,19927,19937,19949,19961,19963,19973,19979,19991,19993,19997,20011,20021,20023,20029,20047,20051,20063,20071,20089,20101,20107,20113,20117,20123,20129,20143,20147,20149,20161,20173,20177,20183,20201,20219,20231,20233,20249,20261,20269,20287,20297,20323,20327,20333,20341,20347,20353,20357,20359,20369,20389,20393,20399,20407,20411,20431,20441,20443,20477,20479,20483,20507,20509,20521,20533,20543,20549,20551,20563,20593,20599,20611,20627,20639,20641,20663,20681,20693,20707,20717,20719,20731,20743,20747,20749,20753,20759,20771,20773,20789,20807,20809,20849,20857,20873,20879,20887,20897,20899,20903,20921,20929,20939,20947,20959,20963,20981,20983,21001,21011,21013,21017,21019,21023,21031,21059,21061,21067,21089,21101,21107,21121,21139,21143,21149,21157,21163,21169,21179,21187,21191,21193,21211,21221,21227,21247,21269,21277,21283,21313,21317,21319,21323,21341,21347,21377,21379,21383,21391,21397,21401,21407,21419,21433,21467,21481,21487,21491,21493,21499,21503,21517,21521,21523,21529,21557,21559,21563,21569,21577,21587,21589,21599,21601,21611,21613,21617,21647,21649,21661,21673,21683,21701,21713,21727,21737,21739,21751,21757,21767,21773,21787,21799,21803,21817,21821,21839,21841,21851,21859,21863,21871,21881,21893,21911,21929,21937,21943,21961,21977,21991,21997,22003,22013,22027,22031,22037,22039,22051,22063,22067,22073,22079,22091,22093,22109,22111,22123,22129,22133,22147,22153,22157,22159,22171,22189,22193,22229,22247,22259,22271,22273,22277,22279,22283,22291,22303,22307,22343,22349,22367,22369,22381,22391,22397,22409,22433,22441,22447,22453,22469,22481,22483,22501,22511,22531,22541,22543,22549,22567,22571,22573,22613,22619,22621,22637,22639,22643,22651,22669,22679,22691,22697,22699,22709,22717,22721,22727,22739,22741,22751,22769,22777,22783,22787,22807,22811,22817,22853,22859,22861,22871,22877,22901,22907,22921,22937,22943,22961,22963,22973,22993,23003,23011,23017,23021,23027,23029,23039,23041,23053,23057,23059,23063,23071,23081,23087,23099,23117,23131,23143,23159,23167,23173,23189,23197,23201,23203,23209,23227,23251,23269,23279,23291,23293,23297,23311,23321,23327,23333,23339,23357,23369,23371,23399,23417,23431,23447,23459,23473,23497,23509,23531,23537,23539,23549,23557,23561,23563,23567,23581,23593,23599,23603,23609,23623,23627,23629,23633,23663,23669,23671,23677,23687,23689,23719,23741,23743,23747,23753,23761,23767,23773,23789,23801,23813,23819,23827,23831,23833,23857,23869,23873,23879,23887,23893,23899,23909,23911,23917,23929,23957,23971,23977,23981,23993,24001,24007,24019,24023,24029,24043,24049,24061,24071,24077,24083,24091,24097,24103,24107,24109,24113,24121,24133,24137,24151,24169,24179,24181,24197,24203,24223,24229,24239,24247,24251,24281,24317,24329,24337,24359,24371,24373,24379,24391,24407,24413,24419,24421,24439,24443,24469,24473,24481,24499,24509,24517,24527,24533,24547,24551,24571,24593,24611,24623,24631,24659,24671,24677,24683,24691,24697,24709,24733,24749,24763,24767,24781,24793,24799,24809,24821,24841,24847,24851,24859,24877,24889,24907,24917,24919,24923,24943,24953,24967,24971,24977,24979,24989,25013,25031,25033,25037,25057,25073,25087,25097,25111,25117,25121,25127,25147,25153,25163,25169,25171,25183,25189,25219,25229,25237,25243,25247,25253,25261,25301,25303,25307,25309,25321,25339,25343,25349,25357,25367,25373,25391,25409,25411,25423,25439,25447,25453,25457,25463,25469,25471,25523,25537,25541,25561,25577,25579,25583,25589,25601,25603,25609,25621,25633,25639,25643,25657,25667,25673,25679,25693,25703,25717,25733,25741,25747,25759,25763,25771,25793,25799,25801,25819,25841,25847,25849,25867,25873,25889,25903,25913,25919,25931,25933,25939,25943,25951,25969,25981,25997,25999,26003,26017,26021,26029,26041,26053,26083,26099,26107,26111,26113,26119,26141,26153,26161,26171,26177,26183,26189,26203,26209,26227,26237,26249,26251,26261,26263,26267,26293,26297,26309,26317,26321,26339,26347,26357,26371,26387,26393,26399,26407,26417,26423,26431,26437,26449,26459,26479,26489,26497,26501,26513,26539,26557,26561,26573,26591,26597,26627,26633,26641,26647,26669,26681,26683,26687,26693,26699,26701,26711,26713,26717,26723,26729,26731,26737,26759,26777,26783,26801,26813,26821,26833,26839,26849,26861,26863,26879,26881,26891,26893,26903,26921,26927,26947,26951,26953,26959,26981,26987,26993,27011,27017,27031,27043,27059,27061,27067,27073,27077,27091,27103,27107,27109,27127,27143,27179,27191,27197,27211,27239,27241,27253,27259,27271,27277,27281,27283,27299,27329,27337,27361,27367,27397,27407,27409,27427,27431,27437,27449,27457,27479,27481,27487,27509,27527,27529,27539,27541,27551,27581,27583,27611,27617,27631,27647,27653,27673,27689,27691,27697,27701,27733,27737,27739,27743,27749,27751,27763,27767,27773,27779,27791,27793,27799,27803,27809,27817,27823,27827,27847,27851,27883,27893,27901,27917,27919,27941,27943,27947,27953,27961,27967,27983,27997,28001,28019,28027,28031,28051,28057,28069,28081,28087,28097,28099,28109,28111,28123,28151,28163,28181,28183,28201,28211,28219,28229,28277,28279,28283,28289,28297,28307,28309,28319,28349,28351,28387,28393,28403,28409,28411,28429,28433,28439,28447,28463,28477,28493,28499,28513,28517,28537,28541,28547,28549,28559,28571,28573,28579,28591,28597,28603,28607,28619,28621,28627,28631,28643,28649,28657,28661,28663,28669,28687,28697,28703,28711,28723,28729,28751,28753,28759,28771,28789,28793,28807,28813,28817,28837,28843,28859,28867,28871,28879,28901,28909,28921,28927,28933,28949,28961,28979,29009,29017,29021,29023,29027,29033,29059,29063,29077,29101,29123,29129,29131,29137,29147,29153,29167,29173,29179,29191,29201,29207,29209,29221,29231,29243,29251,29269,29287,29297,29303,29311,29327,29333,29339,29347,29363,29383,29387,29389,29399,29401,29411,29423,29429,29437,29443,29453,29473,29483,29501,29527,29531,29537,29567,29569,29573,29581,29587,29599,29611,29629,29633,29641,29663,29669,29671,29683,29717,29723,29741,29753,29759,29761,29789,29803,29819,29833,29837,29851,29863,29867,29873,29879,29881,29917,29921,29927,29947,29959,29983,29989,30011,30013,30029,30047,30059,30071,30089,30091,30097,30103,30109,30113,30119,30133,30137,30139,30161,30169,30181,30187,30197,30203,30211,30223,30241,30253,30259,30269,30271,30293,30307,30313,30319,30323,30341,30347,30367,30389,30391,30403,30427,30431,30449,30467,30469,30491,30493,30497,30509,30517,30529,30539,30553,30557,30559,30577,30593,30631,30637,30643,30649,30661,30671,30677,30689,30697,30703,30707,30713,30727,30757,30763,30773,30781,30803,30809,30817,30829,30839,30841,30851,30853,30859,30869,30871,30881,30893,30911,30931,30937,30941,30949,30971,30977,30983,31013,31019,31033,31039,31051,31063,31069,31079,31081,31091,31121,31123,31139,31147,31151,31153,31159,31177,31181,31183,31189,31193,31219,31223,31231,31237,31247,31249,31253,31259,31267,31271,31277,31307,31319,31321,31327,31333,31337,31357,31379,31387,31391,31393,31397,31469,31477,31481,31489,31511,31513,31517,31531,31541,31543,31547,31567,31573,31583,31601,31607,31627,31643,31649,31657,31663,31667,31687,31699,31721,31723,31727,31729,31741,31751,31769,31771,31793,31799,31817,31847,31849,31859,31873,31883,31891,31907,31957,31963,31973,31981,31991,32003,32009,32027,32029,32051,32057,32059,32063,32069,32077,32083,32089,32099,32117,32119,32141,32143,32159,32173,32183,32189,32191,32203,32213,32233,32237,32251,32257,32261,32297,32299,32303,32309,32321,32323,32327,32341,32353,32359,32363,32369,32371,32377,32381,32401,32411,32413,32423,32429,32441,32443,32467,32479,32491,32497,32503,32507,32531,32533,32537,32561,32563,32569,32573,32579,32587,32603,32609,32611,32621,32633,32647,32653,32687,32693,32707,32713,32717,32719,32749,32771,32779,32783,32789,32797,32801,32803,32831,32833,32839,32843,32869,32887,32909,32911,32917,32933,32939,32941,32957,32969,32971,32983,32987,32993,32999,33013,33023,33029,33037,33049,33053,33071,33073,33083,33091,33107,33113,33119,33149,33151,33161,33179,33181,33191,33199,33203,33211,33223,33247,33287,33289,33301,33311,33317,33329,33331,33343,33347,33349,33353,33359,33377,33391,33403,33409,33413,33427,33457,33461,33469,33479,33487,33493,33503,33521,33529,33533,33547,33563,33569,33577,33581,33587,33589,33599,33601,33613,33617,33619,33623,33629,33637,33641,33647,33679,33703,33713,33721,33739,33749,33751,33757,33767,33769,33773,33791,33797,33809,33811,33827,33829,33851,33857,33863,33871,33889,33893,33911,33923,33931,33937,33941,33961,33967,33997,34019,34031,34033,34039,34057,34061,34123,34127,34129,34141,34147,34157,34159,34171,34183,34211,34213,34217,34231,34253,34259,34261,34267,34273,34283,34297,34301,34303,34313,34319,34327,34337,34351,34361,34367,34369,34381,34403,34421,34429,34439,34457,34469,34471,34483,34487,34499,34501,34511,34513,34519,34537,34543,34549,34583,34589,34591,34603,34607,34613,34631,34649,34651,34667,34673,34679,34687,34693,34703,34721,34729,34739,34747,34757,34759,34763,34781,34807,34819,34841,34843,34847,34849,34871,34877,34883,34897,34913,34919,34939,34949,34961,34963,34981,35023,35027,35051,35053,35059,35069,35081,35083,35089,35099,35107,35111,35117,35129,35141,35149,35153,35159,35171,35201,35221,35227,35251,35257,35267,35279,35281,35291,35311,35317,35323,35327,35339,35353,35363,35381,35393,35401,35407,35419,35423,35437,35447,35449,35461,35491,35507,35509,35521,35527,35531,35533,35537,35543,35569,35573,35591,35593,35597,35603,35617,35671,35677,35729,35731,35747,35753,35759,35771,35797,35801,35803,35809,35831,35837,35839,35851,35863,35869,35879,35897,35899,35911,35923,35933,35951,35963,35969,35977,35983,35993,35999,36007,36011,36013,36017,36037,36061,36067,36073,36083,36097,36107,36109,36131,36137,36151,36161,36187,36191,36209,36217,36229,36241,36251,36263,36269,36277,36293,36299,36307,36313,36319,36341,36343,36353,36373,36383,36389,36433,36451,36457,36467,36469,36473,36479,36493,36497,36523,36527,36529,36541,36551,36559,36563,36571,36583,36587,36599,36607,36629,36637,36643,36653,36671,36677,36683,36691,36697,36709,36713,36721,36739,36749,36761,36767,36779,36781,36787,36791,36793,36809,36821,36833,36847,36857,36871,36877,36887,36899,36901,36913,36919,36923,36929,36931,36943,36947,36973,36979,36997,37003,37013,37019,37021,37039,37049,37057,37061,37087,37097,37117,37123,37139,37159,37171,37181,37189,37199,37201,37217,37223,37243,37253,37273,37277,37307,37309,37313,37321,37337,37339,37357,37361,37363,37369,37379,37397,37409,37423,37441,37447,37463,37483,37489,37493,37501,37507,37511,37517,37529,37537,37547,37549,37561,37567,37571,37573,37579,37589,37591,37607,37619,37633,37643,37649,37657,37663,37691,37693,37699,37717,37747,37781,37783,37799,37811,37813,37831,37847,37853,37861,37871,37879,37889,37897,37907,37951,37957,37963,37967,37987,37991,37993,37997,38011,38039,38047,38053,38069,38083,38113,38119,38149,38153,38167,38177,38183,38189,38197,38201,38219,38231,38237,38239,38261,38273,38281,38287,38299,38303,38317,38321,38327,38329,38333,38351,38371,38377,38393,38431,38447,38449,38453,38459,38461,38501,38543,38557,38561,38567,38569,38593,38603,38609,38611,38629,38639,38651,38653,38669,38671,38677,38693,38699,38707,38711,38713,38723,38729,38737,38747,38749,38767,38783,38791,38803,38821,38833,38839,38851,38861,38867,38873,38891,38903,38917,38921,38923,38933,38953,38959,38971,38977,38993,39019,39023,39041,39043,39047,39079,39089,39097,39103,39107,39113,39119,39133,39139,39157,39161,39163,39181,39191,39199,39209,39217,39227,39229,39233,39239,39241,39251,39293,39301,39313,39317,39323,39341,39343,39359,39367,39371,39373,39383,39397,39409,39419,39439,39443,39451,39461,39499,39503,39509,39511,39521,39541,39551,39563,39569,39581,39607,39619,39623,39631,39659,39667,39671,39679,39703,39709,39719,39727,39733,39749,39761,39769,39779,39791,39799,39821,39827,39829,39839,39841,39847,39857,39863,39869,39877,39883,39887,39901,39929,39937,39953,39971,39979,39983,39989,40009,40013,40031,40037,40039,40063,40087,40093,40099,40111,40123,40127,40129,40151,40153,40163,40169,40177,40189,40193,40213,40231,40237,40241,40253,40277,40283,40289,40343,40351,40357,40361,40387,40423,40427,40429,40433,40459,40471,40483,40487,40493,40499,40507,40519,40529,40531,40543,40559,40577,40583,40591,40597,40609,40627,40637,40639,40693,40697,40699,40709,40739,40751,40759,40763,40771,40787,40801,40813,40819,40823,40829,40841,40847,40849,40853,40867,40879,40883,40897,40903,40927,40933,40939,40949,40961,40973,40993,41011,41017,41023,41039,41047,41051,41057,41077,41081,41113,41117,41131,41141,41143,41149,41161,41177,41179,41183,41189,41201,41203,41213,41221,41227,41231,41233,41243,41257,41263,41269,41281,41299,41333,41341,41351,41357,41381,41387,41389,41399,41411,41413,41443,41453,41467,41479,41491,41507,41513,41519,41521,41539,41543,41549,41579,41593,41597,41603,41609,41611,41617,41621,41627,41641,41647,41651,41659,41669,41681,41687,41719,41729,41737,41759,41761,41771,41777,41801,41809,41813,41843,41849,41851,41863,41879,41887,41893,41897,41903,41911,41927,41941,41947,41953,41957,41959,41969,41981,41983,41999,42013,42017,42019,42023,42043,42061,42071,42073,42083,42089,42101,42131,42139,42157,42169,42179,42181,42187,42193,42197,42209,42221,42223,42227,42239,42257,42281,42283,42293,42299,42307,42323,42331,42337,42349,42359,42373,42379,42391,42397,42403,42407,42409,42433,42437,42443,42451,42457,42461,42463,42467,42473,42487,42491,42499,42509,42533,42557,42569,42571,42577,42589,42611,42641,42643,42649,42667,42677,42683,42689,42697,42701,42703,42709,42719,42727,42737,42743,42751,42767,42773,42787,42793,42797,42821,42829,42839,42841,42853,42859,42863,42899,42901,42923,42929,42937,42943,42953,42961,42967,42979,42989,43003,43013,43019,43037,43049,43051,43063,43067,43093,43103,43117,43133,43151,43159,43177,43189,43201,43207,43223,43237,43261,43271,43283,43291,43313,43319,43321,43331,43391,43397,43399,43403,43411,43427,43441,43451,43457,43481,43487,43499,43517,43541,43543,43573,43577,43579,43591,43597,43607,43609,43613,43627,43633,43649,43651,43661,43669,43691,43711,43717,43721,43753,43759,43777,43781,43783,43787,43789,43793,43801,43853,43867,43889,43891,43913,43933,43943,43951,43961,43963,43969,43973,43987,43991,43997,44017,44021,44027,44029,44041,44053,44059,44071,44087,44089,44101,44111,44119,44123,44129,44131,44159,44171,44179,44189,44201,44203,44207,44221,44249,44257,44263,44267,44269,44273,44279,44281,44293,44351,44357,44371,44381,44383,44389,44417,44449,44453,44483,44491,44497,44501,44507,44519,44531,44533,44537,44543,44549,44563,44579,44587,44617,44621,44623,44633,44641,44647,44651,44657,44683,44687,44699,44701,44711,44729,44741,44753,44771,44773,44777,44789,44797,44809,44819,44839,44843,44851,44867,44879,44887,44893,44909,44917,44927,44939,44953,44959,44963,44971,44983,44987,45007,45013,45053,45061,45077,45083,45119,45121,45127,45131,45137,45139,45161,45179,45181,45191,45197,45233,45247,45259,45263,45281,45289,45293,45307,45317,45319,45329,45337,45341,45343,45361,45377,45389,45403,45413,45427,45433,45439,45481,45491,45497,45503,45523,45533,45541,45553,45557,45569,45587,45589,45599,45613,45631,45641,45659,45667,45673,45677,45691,45697,45707,45737,45751,45757,45763,45767,45779,45817,45821,45823,45827,45833,45841,45853,45863,45869,45887,45893,45943,45949,45953,45959,45971,45979,45989,46021,46027,46049,46051,46061,46073,46091,46093,46099,46103,46133,46141,46147,46153,46171,46181,46183,46187,46199,46219,46229,46237,46261,46271,46273,46279,46301,46307,46309,46327,46337,46349,46351,46381,46399,46411,46439,46441,46447,46451,46457,46471,46477,46489,46499,46507,46511,46523,46549,46559,46567,46573,46589,46591,46601,46619,46633,46639,46643,46649,46663,46679,46681,46687,46691,46703,46723,46727,46747,46751,46757,46769,46771,46807,46811,46817,46819,46829,46831,46853,46861,46867,46877,46889,46901,46919,46933,46957,46993,46997,47017,47041,47051,47057,47059,47087,47093,47111,47119,47123,47129,47137,47143,47147,47149,47161,47189,47207,47221,47237,47251,47269,47279,47287,47293,47297,47303,47309,47317,47339,47351,47353,47363,47381,47387,47389,47407,47417,47419,47431,47441,47459,47491,47497,47501,47507,47513,47521,47527,47533,47543,47563,47569,47581,47591,47599,47609,47623,47629,47639,47653,47657,47659,47681,47699,47701,47711,47713,47717,47737,47741,47743,47777,47779,47791,47797,47807,47809,47819,47837,47843,47857,47869,47881,47903,47911,47917,47933,47939,47947,47951,47963,47969,47977,47981,48017,48023,48029,48049,48073,48079,48091,48109,48119,48121,48131,48157,48163,48179,48187,48193,48197,48221,48239,48247,48259,48271,48281,48299,48311,48313,48337,48341,48353,48371,48383,48397,48407,48409,48413,48437,48449,48463,48473,48479,48481,48487,48491,48497,48523,48527,48533,48539,48541,48563,48571,48589,48593,48611,48619,48623,48647,48649,48661,48673,48677,48679,48731,48733,48751,48757,48761,48767,48779,48781,48787,48799,48809,48817,48821,48823,48847,48857,48859,48869,48871,48883,48889,48907,48947,48953,48973,48989,48991,49003,49009,49019,49031,49033,49037,49043,49057,49069,49081,49103,49109,49117,49121,49123,49139,49157,49169,49171,49177,49193,49199,49201,49207,49211,49223,49253,49261,49277,49279,49297,49307,49331,49333,49339,49363,49367,49369,49391,49393,49409,49411,49417,49429,49433,49451,49459,49463,49477,49481,49499,49523,49529,49531,49537,49547,49549,49559,49597,49603,49613,49627,49633,49639,49663,49667,49669,49681,49697,49711,49727,49739,49741,49747,49757,49783,49787,49789,49801,49807,49811,49823,49831,49843,49853,49871,49877,49891,49919,49921,49927,49937,49939,49943,49957,49991,49993,49999,50021,50023,50033,50047,50051,50053,50069,50077,50087,50093,50101,50111,50119,50123,50129,50131,50147,50153,50159,50177,50207,50221,50227,50231,50261,50263,50273,50287,50291,50311,50321,50329,50333,50341,50359,50363,50377,50383,50387,50411,50417,50423,50441,50459,50461,50497,50503,50513,50527,50539,50543,50549,50551,50581,50587,50591,50593,50599,50627,50647,50651,50671,50683,50707,50723,50741,50753,50767,50773,50777,50789,50821,50833,50839,50849,50857,50867,50873,50891,50893,50909,50923,50929,50951,50957,50969,50971,50989,50993,51001,51031,51043,51047,51059,51061,51071,51109,51131,51133,51137,51151,51157,51169,51193,51197,51199,51203,51217,51229,51239,51241,51257,51263,51283,51287,51307,51329,51341,51343,51347,51349,51361,51383,51407,51413,51419,51421,51427,51431,51437,51439,51449,51461,51473,51479,51481,51487,51503,51511,51517,51521,51539,51551,51563,51577,51581,51593,51599,51607,51613,51631,51637,51647,51659,51673,51679,51683,51691,51713,51719,51721,51749,51767,51769,51787,51797,51803,51817,51827,51829,51839,51853,51859,51869,51871,51893,51899,51907,51913,51929,51941,51949,51971,51973,51977,51991,52009,52021,52027,52051,52057,52067,52069,52081,52103,52121,52127,52147,52153,52163,52177,52181,52183,52189,52201,52223,52237,52249,52253,52259,52267,52289,52291,52301,52313,52321,52361,52363,52369,52379,52387,52391,52433,52453,52457,52489,52501,52511,52517,52529,52541,52543,52553,52561,52567,52571,52579,52583,52609,52627,52631,52639,52667,52673,52691,52697,52709,52711,52721,52727,52733,52747,52757,52769,52783,52807,52813,52817,52837,52859,52861,52879,52883,52889,52901,52903,52919,52937,52951,52957,52963,52967,52973,52981,52999,53003,53017,53047,53051,53069,53077,53087,53089,53093,53101,53113,53117,53129,53147,53149,53161,53171,53173,53189,53197,53201,53231,53233,53239,53267,53269,53279,53281,53299,53309,53323,53327,53353,53359,53377,53381,53401,53407,53411,53419,53437,53441,53453,53479,53503,53507,53527,53549,53551,53569,53591,53593,53597,53609,53611,53617,53623,53629,53633,53639,53653,53657,53681,53693,53699,53717,53719,53731,53759,53773,53777,53783,53791,53813,53819,53831,53849,53857,53861,53881,53887,53891,53897,53899,53917,53923,53927,53939,53951,53959,53987,53993,54001,54011,54013,54037,54049,54059,54083,54091,54101,54121,54133,54139,54151,54163,54167,54181,54193,54217,54251,54269,54277,54287,54293,54311,54319,54323,54331,54347,54361,54367,54371,54377,54401,54403,54409,54413,54419,54421,54437,54443,54449,54469,54493,54497,54499,54503,54517,54521,54539,54541,54547,54559,54563,54577,54581,54583,54601,54617,54623,54629,54631,54647,54667,54673,54679,54709,54713,54721,54727,54751,54767,54773,54779,54787,54799,54829,54833,54851,54869,54877,54881,54907,54917,54919,54941,54949,54959,54973,54979,54983,55001,55009,55021,55049,55051,55057,55061,55073,55079,55103,55109,55117,55127,55147,55163,55171,55201,55207,55213,55217,55219,55229,55243,55249,55259,55291,55313,55331,55333,55337,55339,55343,55351,55373,55381,55399,55411,55439,55441,55457,55469,55487,55501,55511,55529,55541,55547,55579,55589,55603,55609,55619,55621,55631,55633,55639,55661,55663,55667,55673,55681,55691,55697,55711,55717,55721,55733,55763,55787,55793,55799,55807,55813,55817,55819,55823,55829,55837,55843,55849,55871,55889,55897,55901,55903,55921,55927,55931,55933,55949,55967,55987,55997,56003,56009,56039,56041,56053,56081,56087,56093,56099,56101,56113,56123,56131,56149,56167,56171,56179,56197,56207,56209,56237,56239,56249,56263,56267,56269,56299,56311,56333,56359,56369,56377,56383,56393,56401,56417,56431,56437,56443,56453,56467,56473,56477,56479,56489,56501,56503,56509,56519,56527,56531,56533,56543,56569,56591,56597,56599,56611,56629,56633,56659,56663,56671,56681,56687,56701,56711,56713,56731,56737,56747,56767,56773,56779,56783,56807,56809,56813,56821,56827,56843,56857,56873,56891,56893,56897,56909,56911,56921,56923,56929,56941,56951,56957,56963,56983,56989,56993,56999,57037,57041,57047,57059,57073,57077,57089,57097,57107,57119,57131,57139,57143,57149,57163,57173,57179,57191,57193,57203,57221,57223,57241,57251,57259,57269,57271,57283,57287,57301,57329,57331,57347,57349,57367,57373,57383,57389,57397,57413,57427,57457,57467,57487,57493,57503,57527,57529,57557,57559,57571,57587,57593,57601,57637,57641,57649,57653,57667,57679,57689,57697,57709,57713,57719,57727,57731,57737,57751,57773,57781,57787,57791,57793,57803,57809,57829,57839,57847,57853,57859,57881,57899,57901,57917,57923,57943,57947,57973,57977,57991,58013,58027,58031,58043,58049,58057,58061,58067,58073,58099,58109,58111,58129,58147,58151,58153,58169,58171,58189,58193,58199,58207,58211,58217,58229,58231,58237,58243,58271,58309,58313,58321,58337,58363,58367,58369,58379,58391,58393,58403,58411,58417,58427,58439,58441,58451,58453,58477,58481,58511,58537,58543,58549,58567,58573,58579,58601,58603,58613,58631,58657,58661,58679,58687,58693,58699,58711,58727,58733,58741,58757,58763,58771,58787,58789,58831,58889,58897,58901,58907,58909,58913,58921,58937,58943,58963,58967,58979,58991,58997,59009,59011,59021,59023,59029,59051,59053,59063,59069,59077,59083,59093,59107,59113,59119,59123,59141,59149,59159,59167,59183,59197,59207,59209,59219,59221,59233,59239,59243,59263,59273,59281,59333,59341,59351,59357,59359,59369,59377,59387,59393,59399,59407,59417,59419,59441,59443,59447,59453,59467,59471,59473,59497,59509,59513,59539,59557,59561,59567,59581,59611,59617,59621,59627,59629,59651,59659,59663,59669,59671,59693,59699,59707,59723,59729,59743,59747,59753,59771,59779,59791,59797,59809,59833,59863,59879,59887,59921,59929,59951,59957,59971,59981,59999,60013,60017,60029,60037,60041,60077,60083,60089,60091,60101,60103,60107,60127,60133,60139,60149,60161,60167,60169,60209,60217,60223,60251,60257,60259,60271,60289,60293,60317,60331,60337,60343,60353,60373,60383,60397,60413,60427,60443,60449,60457,60493,60497,60509,60521,60527,60539,60589,60601,60607,60611,60617,60623,60631,60637,60647,60649,60659,60661,60679,60689,60703,60719,60727,60733,60737,60757,60761,60763,60773,60779,60793,60811,60821,60859,60869,60887,60889,60899,60901,60913,60917,60919,60923,60937,60943,60953,60961,61001,61007,61027,61031,61043,61051,61057,61091,61099,61121,61129,61141,61151,61153,61169,61211,61223,61231,61253,61261,61283,61291,61297,61331,61333,61339,61343,61357,61363,61379,61381,61403,61409,61417,61441,61463,61469,61471,61483,61487,61493,61507,61511,61519,61543,61547,61553,61559,61561,61583,61603,61609,61613,61627,61631,61637,61643,61651,61657,61667,61673,61681,61687,61703,61717,61723,61729,61751,61757,61781,61813,61819,61837,61843,61861,61871,61879,61909,61927,61933,61949,61961,61967,61979,61981,61987,61991,62003,62011,62017,62039,62047,62053,62057,62071,62081,62099,62119,62129,62131,62137,62141,62143,62171,62189,62191,62201,62207,62213,62219,62233,62273,62297,62299,62303,62311,62323,62327,62347,62351,62383,62401,62417,62423,62459,62467,62473,62477,62483,62497,62501,62507,62533,62539,62549,62563,62581,62591,62597,62603,62617,62627,62633,62639,62653,62659,62683,62687,62701,62723,62731,62743,62753,62761,62773,62791,62801,62819,62827,62851,62861,62869,62873,62897,62903,62921,62927,62929,62939,62969,62971,62981,62983,62987,62989,63029,63031,63059,63067,63073,63079,63097,63103,63113,63127,63131,63149,63179,63197,63199,63211,63241,63247,63277,63281,63299,63311,63313,63317,63331,63337,63347,63353,63361,63367,63377,63389,63391,63397,63409,63419,63421,63439,63443,63463,63467,63473,63487,63493,63499,63521,63527,63533,63541,63559,63577,63587,63589,63599,63601,63607,63611,63617,63629,63647,63649,63659,63667,63671,63689,63691,63697,63703,63709,63719,63727,63737,63743,63761,63773,63781,63793,63799,63803,63809,63823,63839,63841,63853,63857,63863,63901,63907,63913,63929,63949,63977,63997,64007,64013,64019,64033,64037,64063,64067,64081,64091,64109,64123,64151,64153,64157,64171,64187,64189,64217,64223,64231,64237,64271,64279,64283,64301,64303,64319,64327,64333,64373,64381,64399,64403,64433,64439,64451,64453,64483,64489,64499,64513,64553,64567,64577,64579,64591,64601,64609,64613,64621,64627,64633,64661,64663,64667,64679,64693,64709,64717,64747,64763,64781,64783,64793,64811,64817,64849,64853,64871,64877,64879,64891,64901,64919,64921,64927,64937,64951,64969,64997,65003,65011,65027,65029,65033,65053,65063,65071,65089,65099,65101,65111,65119,65123,65129,65141,65147,65167,65171,65173,65179,65183,65203,65213,65239,65257,65267,65269,65287,65293,65309,65323,65327,65353,65357,65371,65381,65393,65407,65413,65419,65423,65437,65447,65449,65479,65497,65519,65521,65537,65539,65543,65551,65557,65563,65579,65581,65587,65599,65609,65617,65629,65633,65647,65651,65657,65677,65687,65699,65701,65707,65713,65717,65719,65729,65731,65761,65777,65789,65809,65827,65831,65837,65839,65843,65851,65867,65881,65899,65921,65927,65929,65951,65957,65963,65981,65983,65993,66029,66037,66041,66047,66067,66071,66083,66089,66103,66107,66109,66137,66161,66169,66173,66179,66191,66221,66239,66271,66293,66301,66337,66343,66347,66359,66361,66373,66377,66383,66403,66413,66431,66449,66457,66463,66467,66491,66499,66509,66523,66529,66533,66541,66553,66569,66571,66587,66593,66601,66617,66629,66643,66653,66683,66697,66701,66713,66721,66733,66739,66749,66751,66763,66791,66797,66809,66821,66841,66851,66853,66863,66877,66883,66889,66919,66923,66931,66943,66947,66949,66959,66973,66977,67003,67021,67033,67043,67049,67057,67061,67073,67079,67103,67121,67129,67139,67141,67153,67157,67169,67181,67187,67189,67211,67213,67217,67219,67231,67247,67261,67271,67273,67289,67307,67339,67343,67349,67369,67391,67399,67409,67411,67421,67427,67429,67433,67447,67453,67477,67481,67489,67493,67499,67511,67523,67531,67537,67547,67559,67567,67577,67579,67589,67601,67607,67619,67631,67651,67679,67699,67709,67723,67733,67741,67751,67757,67759,67763,67777,67783,67789,67801,67807,67819,67829,67843,67853,67867,67883,67891,67901,67927,67931,67933,67939,67943,67957,67961,67967,67979,67987,67993,68023,68041,68053,68059,68071,68087,68099,68111,68113,68141,68147,68161,68171,68207,68209,68213,68219,68227,68239,68261,68279,68281,68311,68329,68351,68371,68389,68399,68437,68443,68447,68449,68473,68477,68483,68489,68491,68501,68507,68521,68531,68539,68543,68567,68581,68597,68611,68633,68639,68659,68669,68683,68687,68699,68711,68713,68729,68737,68743,68749,68767,68771,68777,68791,68813,68819,68821,68863,68879,68881,68891,68897,68899,68903,68909,68917,68927,68947,68963,68993,69001,69011,69019,69029,69031,69061,69067,69073,69109,69119,69127,69143,69149,69151,69163,69191,69193,69197,69203,69221,69233,69239,69247,69257,69259,69263,69313,69317,69337,69341,69371,69379,69383,69389,69401,69403,69427,69431,69439,69457,69463,69467,69473,69481,69491,69493,69497,69499,69539,69557,69593,69623,69653,69661,69677,69691,69697,69709,69737,69739,69761,69763,69767,69779,69809,69821,69827,69829,69833,69847,69857,69859,69877,69899,69911,69929,69931,69941,69959,69991,69997,70001,70003,70009,70019,70039,70051,70061,70067,70079,70099,70111,70117,70121,70123,70139,70141,70157,70163,70177,70181,70183,70199,70201,70207,70223,70229,70237,70241,70249,70271,70289,70297,70309,70313,70321,70327,70351,70373,70379,70381,70393,70423,70429,70439,70451,70457,70459,70481,70487,70489,70501,70507,70529,70537,70549,70571,70573,70583,70589,70607,70619,70621,70627,70639,70657,70663,70667,70687,70709,70717,70729,70753,70769,70783,70793,70823,70841,70843,70849,70853,70867,70877,70879,70891,70901,70913,70919,70921,70937,70949,70951,70957,70969,70979,70981,70991,70997,70999,71011,71023,71039,71059,71069,71081,71089,71119,71129,71143,71147,71153,71161,71167,71171,71191,71209,71233,71237,71249,71257,71261,71263,71287,71293,71317,71327,71329,71333,71339,71341,71347,71353,71359,71363,71387,71389,71399,71411,71413,71419,71429,71437,71443,71453,71471,71473,71479,71483,71503,71527,71537,71549,71551,71563,71569,71593,71597,71633,71647,71663,71671,71693,71699,71707,71711,71713,71719,71741,71761,71777,71789,71807,71809,71821,71837,71843,71849,71861,71867,71879,71881,71887,71899,71909,71917,71933,71941,71947,71963,71971,71983,71987,71993,71999,72019,72031,72043,72047,72053,72073,72077,72089,72091,72101,72103,72109,72139,72161,72167,72169,72173,72211,72221,72223,72227,72229,72251,72253,72269,72271,72277,72287,72307,72313,72337,72341,72353,72367,72379,72383,72421,72431,72461,72467,72469,72481,72493,72497,72503,72533,72547,72551,72559,72577,72613,72617,72623,72643,72647,72649,72661,72671,72673,72679,72689,72701,72707,72719,72727,72733,72739,72763,72767,72797,72817,72823,72859,72869,72871,72883,72889,72893,72901,72907,72911,72923,72931,72937,72949,72953,72959,72973,72977,72997,73009,73013,73019,73037,73039,73043,73061,73063,73079,73091,73121,73127,73133,73141,73181,73189,73237,73243,73259,73277,73291,73303,73309,73327,73331,73351,73361,73363,73369,73379,73387,73417,73421,73433,73453,73459,73471,73477,73483,73517,73523,73529,73547,73553,73561,73571,73583,73589,73597,73607,73609,73613,73637,73643,73651,73673,73679,73681,73693,73699,73709,73721,73727,73751,73757,73771,73783,73819,73823,73847,73849,73859,73867,73877,73883,73897,73907,73939,73943,73951,73961,73973,73999,74017,74021,74027,74047,74051,74071,74077,74093,74099,74101,74131,74143,74149,74159,74161,74167,74177,74189,74197,74201,74203,74209,74219,74231,74257,74279,74287,74293,74297,74311,74317,74323,74353,74357,74363,74377,74381,74383,74411,74413,74419,74441,74449,74453,74471,74489,74507,74509,74521,74527,74531,74551,74561,74567,74573,74587,74597,74609,74611,74623,74653,74687,74699,74707,74713,74717,74719,74729,74731,74747,74759,74761,74771,74779,74797,74821,74827,74831,74843,74857,74861,74869,74873,74887,74891,74897,74903,74923,74929,74933,74941,74959,75011,75013,75017,75029,75037,75041,75079,75083,75109,75133,75149,75161,75167,75169,75181,75193,75209,75211,75217,75223,75227,75239,75253,75269,75277,75289,75307,75323,75329,75337,75347,75353,75367,75377,75389,75391,75401,75403,75407,75431,75437,75479,75503,75511,75521,75527,75533,75539,75541,75553,75557,75571,75577,75583,75611,75617,75619,75629,75641,75653,75659,75679,75683,75689,75703,75707,75709,75721,75731,75743,75767,75773,75781,75787,75793,75797,75821,75833,75853,75869,75883,75913,75931,75937,75941,75967,75979,75983,75989,75991,75997,76001,76003,76031,76039,76079,76081,76091,76099,76103,76123,76129,76147,76157,76159,76163,76207,76213,76231,76243,76249,76253,76259,76261,76283,76289,76303,76333,76343,76367,76369,76379,76387,76403,76421,76423,76441,76463,76471,76481,76487,76493,76507,76511,76519,76537,76541,76543,76561,76579,76597,76603,76607,76631,76649,76651,76667,76673,76679,76697,76717,76733,76753,76757,76771,76777,76781,76801,76819,76829,76831,76837,76847,76871,76873,76883,76907,76913,76919,76943,76949,76961,76963,76991,77003,77017,77023,77029,77041,77047,77069,77081,77093,77101,77137,77141,77153,77167,77171,77191,77201,77213,77237,77239,77243,77249,77261,77263,77267,77269,77279,77291,77317,77323,77339,77347,77351,77359,77369,77377,77383,77417,77419,77431,77447,77471,77477,77479,77489,77491,77509,77513,77521,77527,77543,77549,77551,77557,77563,77569,77573,77587,77591,77611,77617,77621,77641,77647,77659,77681,77687,77689,77699,77711,77713,77719,77723,77731,77743,77747,77761,77773,77783,77797,77801,77813,77839,77849,77863,77867,77893,77899,77929,77933,77951,77969,77977,77983,77999,78007,78017,78031,78041,78049,78059,78079,78101,78121,78137,78139,78157,78163,78167,78173,78179,78191,78193,78203,78229,78233,78241,78259,78277,78283,78301,78307,78311,78317,78341,78347,78367,78401,78427,78437,78439,78467,78479,78487,78497,78509,78511,78517,78539,78541,78553,78569,78571,78577,78583,78593,78607,78623,78643,78649,78653,78691,78697,78707,78713,78721,78737,78779,78781,78787,78791,78797,78803,78809,78823,78839,78853,78857,78877,78887,78889,78893,78901,78919,78929,78941,78977,78979,78989,79031,79039,79043,79063,79087,79103,79111,79133,79139,79147,79151,79153,79159,79181,79187,79193,79201,79229,79231,79241,79259,79273,79279,79283,79301,79309,79319,79333,79337,79349,79357,79367,79379,79393,79397,79399,79411,79423,79427,79433,79451,79481,79493,79531,79537,79549,79559,79561,79579,79589,79601,79609,79613,79621,79627,79631,79633,79657,79669,79687,79691,79693,79697,79699,79757,79769,79777,79801,79811,79813,79817,79823,79829,79841,79843,79847,79861,79867,79873,79889,79901,79903,79907,79939,79943,79967,79973,79979,79987,79997,79999,80021,80039,80051,80071,80077,80107,80111,80141,80147,80149,80153,80167,80173,80177,80191,80207,80209,80221,80231,80233,80239,80251,80263,80273,80279,80287,80309,80317,80329,80341,80347,80363,80369,80387,80407,80429,80447,80449,80471,80473,80489,80491,80513,80527,80537,80557,80567,80599,80603,80611,80621,80627,80629,80651,80657,80669,80671,80677,80681,80683,80687,80701,80713,80737,80747,80749,80761,80777,80779,80783,80789,80803,80809,80819,80831,80833,80849,80863,80897,80909,80911,80917,80923,80929,80933,80953,80963,80989,81001,81013,81017,81019,81023,81031,81041,81043,81047,81049,81071,81077,81083,81097,81101,81119,81131,81157,81163,81173,81181,81197,81199,81203,81223,81233,81239,81281,81283,81293,81299,81307,81331,81343,81349,81353,81359,81371,81373,81401,81409,81421,81439,81457,81463,81509,81517,81527,81533,81547,81551,81553,81559,81563,81569,81611,81619,81629,81637,81647,81649,81667,81671,81677,81689,81701,81703,81707,81727,81737,81749,81761,81769,81773,81799,81817,81839,81847,81853,81869,81883,81899,81901,81919,81929,81931,81937,81943,81953,81967,81971,81973,82003,82007,82009,82013,82021,82031,82037,82039,82051,82067,82073,82129,82139,82141,82153,82163,82171,82183,82189,82193,82207,82217,82219,82223,82231,82237,82241,82261,82267,82279,82301,82307,82339,82349,82351,82361,82373,82387,82393,82421,82457,82463,82469,82471,82483,82487,82493,82499,82507,82529,82531,82549,82559,82561,82567,82571,82591,82601,82609,82613,82619,82633,82651,82657,82699,82721,82723,82727,82729,82757,82759,82763,82781,82787,82793,82799,82811,82813,82837,82847,82883,82889,82891,82903,82913,82939,82963,82981,82997,83003,83009,83023,83047,83059,83063,83071,83077,83089,83093,83101,83117,83137,83177,83203,83207,83219,83221,83227,83231,83233,83243,83257,83267,83269,83273,83299,83311,83339,83341,83357,83383,83389,83399,83401,83407,83417,83423,83431,83437,83443,83449,83459,83471,83477,83497,83537,83557,83561,83563,83579,83591,83597,83609,83617,83621,83639,83641,83653,83663,83689,83701,83717,83719,83737,83761,83773,83777,83791,83813,83833,83843,83857,83869,83873,83891,83903,83911,83921,83933,83939,83969,83983,83987,84011,84017,84047,84053,84059,84061,84067,84089,84121,84127,84131,84137,84143,84163,84179,84181,84191,84199,84211,84221,84223,84229,84239,84247,84263,84299,84307,84313,84317,84319,84347,84349,84377,84389,84391,84401,84407,84421,84431,84437,84443,84449,84457,84463,84467,84481,84499,84503,84509,84521,84523,84533,84551,84559,84589,84629,84631,84649,84653,84659,84673,84691,84697,84701,84713,84719,84731,84737,84751,84761,84787,84793,84809,84811,84827,84857,84859,84869,84871,84913,84919,84947,84961,84967,84977,84979,84991,85009,85021,85027,85037,85049,85061,85081,85087,85091,85093,85103,85109,85121,85133,85147,85159,85193,85199,85201,85213,85223,85229,85237,85243,85247,85259,85297,85303,85313,85331,85333,85361,85363,85369,85381,85411,85427,85429,85439,85447,85451,85453,85469,85487,85513,85517,85523,85531,85549,85571,85577,85597,85601,85607,85619,85621,85627,85639,85643,85661,85667,85669,85691,85703,85711,85717,85733,85751,85781,85793,85817,85819,85829,85831,85837,85843,85847,85853,85889,85903,85909,85931,85933,85991,85999,86011,86017,86027,86029,86069,86077,86083,86111,86113,86117,86131,86137,86143,86161,86171,86179,86183,86197,86201,86209,86239,86243,86249,86257,86263,86269,86287,86291,86293,86297,86311,86323,86341,86351,86353,86357,86369,86371,86381,86389,86399,86413,86423,86441,86453,86461,86467,86477,86491,86501,86509,86531,86533,86539,86561,86573,86579,86587,86599,86627,86629,86677,86689,86693,86711,86719,86729,86743,86753,86767,86771,86783,86813,86837,86843,86851,86857,86861,86869,86923,86927,86929,86939,86951,86959,86969,86981,86993,87011,87013,87037,87041,87049,87071,87083,87103,87107,87119,87121,87133,87149,87151,87179,87181,87187,87211,87221,87223,87251,87253,87257,87277,87281,87293,87299,87313,87317,87323,87337,87359,87383,87403,87407,87421,87427,87433,87443,87473,87481,87491,87509,87511,87517,87523,87539,87541,87547,87553,87557,87559,87583,87587,87589,87613,87623,87629,87631,87641,87643,87649,87671,87679,87683,87691,87697,87701,87719,87721,87739,87743,87751,87767,87793,87797,87803,87811,87833,87853,87869,87877,87881,87887,87911,87917,87931,87943,87959,87961,87973,87977,87991,88001,88003,88007,88019,88037,88069,88079,88093,88117,88129,88169,88177,88211,88223,88237,88241,88259,88261,88289,88301,88321,88327,88337,88339,88379,88397,88411,88423,88427,88463,88469,88471,88493,88499,88513,88523,88547,88589,88591,88607,88609,88643,88651,88657,88661,88663,88667,88681,88721,88729,88741,88747,88771,88789,88793,88799,88801,88807,88811,88813,88817,88819,88843,88853,88861,88867,88873,88883,88897,88903,88919,88937,88951,88969,88993,88997,89003,89009,89017,89021,89041,89051,89057,89069,89071,89083,89087,89101,89107,89113,89119,89123,89137,89153,89189,89203,89209,89213,89227,89231,89237,89261,89269,89273,89293,89303,89317,89329,89363,89371,89381,89387,89393,89399,89413,89417,89431,89443,89449,89459,89477,89491,89501,89513,89519,89521,89527,89533,89561,89563,89567,89591,89597,89599,89603,89611,89627,89633,89653,89657,89659,89669,89671,89681,89689,89753,89759,89767,89779,89783,89797,89809,89819,89821,89833,89839,89849,89867,89891,89897,89899,89909,89917,89923,89939,89959,89963,89977,89983,89989,90001,90007,90011,90017,90019,90023,90031,90053,90059,90067,90071,90073,90089,90107,90121,90127,90149,90163,90173,90187,90191,90197,90199,90203,90217,90227,90239,90247,90263,90271,90281,90289,90313,90353,90359,90371,90373,90379,90397,90401,90403,90407,90437,90439,90469,90473,90481,90499,90511,90523,90527,90529,90533,90547,90583,90599,90617,90619,90631,90641,90647,90659,90677,90679,90697,90703,90709,90731,90749,90787,90793,90803,90821,90823,90833,90841,90847,90863,90887,90901,90907,90911,90917,90931,90947,90971,90977,90989,90997,91009,91019,91033,91079,91081,91097,91099,91121,91127,91129,91139,91141,91151,91153,91159,91163,91183,91193,91199,91229,91237,91243,91249,91253,91283,91291,91297,91303,91309,91331,91367,91369,91373,91381,91387,91393,91397,91411,91423,91433,91453,91457,91459,91463,91493,91499,91513,91529,91541,91571,91573,91577,91583,91591,91621,91631,91639,91673,91691,91703,91711,91733,91753,91757,91771,91781,91801,91807,91811,91813,91823,91837,91841,91867,91873,91909,91921,91939,91943,91951,91957,91961,91967,91969,91997,92003,92009,92033,92041,92051,92077,92083,92107,92111,92119,92143,92153,92173,92177,92179,92189,92203,92219,92221,92227,92233,92237,92243,92251,92269,92297,92311,92317,92333,92347,92353,92357,92363,92369,92377,92381,92383,92387,92399,92401,92413,92419,92431,92459,92461,92467,92479,92489,92503,92507,92551,92557,92567,92569,92581,92593,92623,92627,92639,92641,92647,92657,92669,92671,92681,92683,92693,92699,92707,92717,92723,92737,92753,92761,92767,92779,92789,92791,92801,92809,92821,92831,92849,92857,92861,92863,92867,92893,92899,92921,92927,92941,92951,92957,92959,92987,92993,93001,93047,93053,93059,93077,93083,93089,93097,93103,93113,93131,93133,93139,93151,93169,93179,93187,93199,93229,93239,93241,93251,93253,93257,93263,93281,93283,93287,93307,93319,93323,93329,93337,93371,93377,93383,93407,93419,93427,93463,93479,93481,93487,93491,93493,93497,93503,93523,93529,93553,93557,93559,93563,93581,93601,93607,93629,93637,93683,93701,93703,93719,93739,93761,93763,93787,93809,93811,93827,93851,93871,93887,93889,93893,93901,93911,93913,93923,93937,93941,93949,93967,93971,93979,93983,93997,94007,94009,94033,94049,94057,94063,94079,94099,94109,94111,94117,94121,94151,94153,94169,94201,94207,94219,94229,94253,94261,94273,94291,94307,94309,94321,94327,94331,94343,94349,94351,94379,94397,94399,94421,94427,94433,94439,94441,94447,94463,94477,94483,94513,94529,94531,94541,94543,94547,94559,94561,94573,94583,94597,94603,94613,94621,94649,94651,94687,94693,94709,94723,94727,94747,94771,94777,94781,94789,94793,94811,94819,94823,94837,94841,94847,94849,94873,94889,94903,94907,94933,94949,94951,94961,94993,94999,95003,95009,95021,95027,95063,95071,95083,95087,95089,95093,95101,95107,95111,95131,95143,95153,95177,95189,95191,95203,95213,95219,95231,95233,95239,95257,95261,95267,95273,95279,95287,95311,95317,95327,95339,95369,95383,95393,95401,95413,95419,95429,95441,95443,95461,95467,95471,95479,95483,95507,95527,95531,95539,95549,95561,95569,95581,95597,95603,95617,95621,95629,95633,95651,95701,95707,95713,95717,95723,95731,95737,95747,95773,95783,95789,95791,95801,95803,95813,95819,95857,95869,95873,95881,95891,95911,95917,95923,95929,95947,95957,95959,95971,95987,95989,96001,96013,96017,96043,96053,96059,96079,96097,96137,96149,96157,96167,96179,96181,96199,96211,96221,96223,96233,96259,96263,96269,96281,96289,96293,96323,96329,96331,96337,96353,96377,96401,96419,96431,96443,96451,96457,96461,96469,96479,96487,96493,96497,96517,96527,96553,96557,96581,96587,96589,96601,96643,96661,96667,96671,96697,96703,96731,96737,96739,96749,96757,96763,96769,96779,96787,96797,96799,96821,96823,96827,96847,96851,96857,96893,96907,96911,96931,96953,96959,96973,96979,96989,96997,97001,97003,97007,97021,97039,97073,97081,97103,97117,97127,97151,97157,97159,97169,97171,97177,97187,97213,97231,97241,97259,97283,97301,97303,97327,97367,97369,97373,97379,97381,97387,97397,97423,97429,97441,97453,97459,97463,97499,97501,97511,97523,97547,97549,97553,97561,97571,97577,97579,97583,97607,97609,97613,97649,97651,97673,97687,97711,97729,97771,97777,97787,97789,97813,97829,97841,97843,97847,97849,97859,97861,97871,97879,97883,97919,97927,97931,97943,97961,97967,97973,97987,98009,98011,98017,98041,98047,98057,98081,98101,98123,98129,98143,98179,98207,98213,98221,98227,98251,98257,98269,98297,98299,98317,98321,98323,98327,98347,98369,98377,98387,98389,98407,98411,98419,98429,98443,98453,98459,98467,98473,98479,98491,98507,98519,98533,98543,98561,98563,98573,98597,98621,98627,98639,98641,98663,98669,98689,98711,98713,98717,98729,98731,98737,98773,98779,98801,98807,98809,98837,98849,98867,98869,98873,98887,98893,98897,98899,98909,98911,98927,98929,98939,98947,98953,98963,98981,98993,98999,99013,99017,99023,99041,99053,99079,99083,99089,99103,99109,99119,99131,99133,99137,99139,99149,99173,99181,99191,99223,99233,99241,99251,99257,99259,99277,99289,99317,99347,99349,99367,99371,99377,99391,99397,99401,99409,99431,99439,99469,99487,99497,99523,99527,99529,99551,99559,99563,99571,99577,99581,99607,99611,99623,99643,99661,99667,99679,99689,99707,99709,99713,99719,99721,99733,99761,99767,99787,99793,99809,99817,99823,99829,99833,99839,99859,99871,99877,99881,99901,99907,99923,99929,99961,99971,99989,99991,100003,100019,100043,100049,100057,100069,100103,100109,100129,100151,100153,100169,100183,100189,100193,100207,100213,100237,100267,100271,100279,100291,100297,100313,100333,100343,100357,100361,100363,100379,100391,100393,100403,100411,100417,100447,100459,100469,100483,100493,100501,100511,100517,100519,100523,100537,100547,100549,100559,100591,100609,100613,100621,100649,100669,100673,100693,100699,100703,100733,100741,100747,100769,100787,100799,100801,100811,100823,100829,100847,100853,100907,100913,100927,100931,100937,100943,100957,100981,100987,100999,101009,101021,101027,101051,101063,101081,101089,101107,101111,101113,101117,101119,101141,101149,101159,101161,101173,101183,101197,101203,101207,101209,101221,101267,101273,101279,101281,101287,101293,101323,101333,101341,101347,101359,101363,101377,101383,101399,101411,101419,101429,101449,101467,101477,101483,101489,101501,101503,101513,101527,101531,101533,101537,101561,101573,101581,101599,101603,101611,101627,101641,101653,101663,101681,101693,101701,101719,101723,101737,101741,101747,101749,101771,101789,101797,101807,101833,101837,101839,101863,101869,101873,101879,101891,101917,101921,101929,101939,101957,101963,101977,101987,101999,102001,102013,102019,102023,102031,102043,102059,102061,102071,102077,102079,102101,102103,102107,102121,102139,102149,102161,102181,102191,102197,102199,102203,102217,102229,102233,102241,102251,102253,102259,102293,102299,102301,102317,102329,102337,102359,102367,102397,102407,102409,102433,102437,102451,102461,102481,102497,102499,102503,102523,102533,102539,102547,102551,102559,102563,102587,102593,102607,102611,102643,102647,102653,102667,102673,102677,102679,102701,102761,102763,102769,102793,102797,102811,102829,102841,102859,102871,102877,102881,102911,102913,102929,102931,102953,102967,102983,103001,103007,103043,103049,103067,103069,103079,103087,103091,103093,103099,103123,103141,103171,103177,103183,103217,103231,103237,103289,103291,103307,103319,103333,103349,103357,103387,103391,103393,103399,103409,103421,103423,103451,103457,103471,103483,103511,103529,103549,103553,103561,103567,103573,103577,103583,103591,103613,103619,103643,103651,103657,103669,103681,103687,103699,103703,103723,103769,103787,103801,103811,103813,103837,103841,103843,103867,103889,103903,103913,103919,103951,103963,103967,103969,103979,103981,103991,103993,103997,104003,104009,104021,104033,104047,104053,104059,104087,104089,104107,104113,104119,104123,104147,104149,104161,104173,104179,104183,104207,104231,104233,104239,104243,104281,104287,104297,104309,104311,104323,104327,104347,104369,104381,104383,104393,104399,104417,104459,104471,104473,104479,104491,104513,104527,104537,104543,104549,104551,104561,104579,104593,104597,104623,104639,104651,104659,104677,104681,104683,104693,104701,104707,104711,104717,104723,104729'</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @Delimiter <span style="color:#0000ff;">Char</span>(1)=<span style="color:#006080;">','</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Declare</span> @XML XML=N<span style="color:#006080;">'&lt;root&gt;&lt;r&gt;'</span>+Replace(@S,@Delimiter,<span style="color:#006080;">'&lt;/r&gt;&lt;r&gt;'</span>)+<span style="color:#006080;">'&lt;/r&gt;&lt;/root&gt;'</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  <span style="color:#0000ff;">Cast</span>(R.<span style="color:#0000ff;">value</span>(<span style="color:#006080;">'.'</span>,<span style="color:#006080;">'Varchar(Max)'</span>) <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Int</span>) N</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Into</span>    T_Primes</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    @XML.nodes(<span style="color:#006080;">'//root/r'</span>) Records(R);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Table</span> T_Primes <span style="color:#0000ff;">Add</span> ID <span style="color:#0000ff;">Int</span> <span style="color:#0000ff;">Identity</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Table</span> T_Primes <span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Column</span> N <span style="color:#0000ff;">Int</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Table</span> T_Primes <span style="color:#0000ff;">Add</span> <span style="color:#0000ff;">Constraint</span> [PK_T_Primes] <span style="color:#0000ff;">Primary</span> <span style="color:#0000ff;">Key</span> <span style="color:#0000ff;">Clustered</span>(N);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">Unique</span> <span style="color:#0000ff;">Index</span> [Idx_T_Primes_ID] <span style="color:#0000ff;">On</span> T_Primes(ID);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">GO</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span> *</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>   T_Primes;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image003.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image003" src="http://gerireshef.files.wordpress.com/2012/01/clip_image003_thumb.jpg?w=664&#038;h=538" alt="clip_image003" width="664" height="538" border="0" /></a></p>
<p>על ביצוע Split בעזרת XML כתבתי <a href="http://gerireshef.wordpress.com/2011/08/24/%d7%97%d7%99%d7%aa%d7%95%d7%9a-%d7%91%d7%99%d7%9f-%d7%a8%d7%a9%d7%99%d7%9e%d7%95%d7%aa/">כאן</a>.</p>
<p>וכעת ניצור טבלה לדוגמה ונאכלס אותה בנתונים:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">If</span> Object_Id(<span style="color:#006080;">'T_Tree'</span>,<span style="color:#006080;">'U'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> T_Tree;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">Table</span> T_Tree(ID <span style="color:#0000ff;">Int</span> <span style="color:#0000ff;">Identity</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                    Prime <span style="color:#0000ff;">Int</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                    Multiply BigInt <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                    [Description] <span style="color:#0000ff;">Varchar</span>(<span style="color:#0000ff;">Max</span>),</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                    [<span style="color:#0000ff;">Level</span>] <span style="color:#0000ff;">Int</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Into</span>   T_Tree</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Top</span> 10 N Prime,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">       1 Multiply,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">       <span style="color:#0000ff;">Cast</span>(@@<span style="color:#0000ff;">Identity</span> <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">'('</span>+<span style="color:#0000ff;">Cast</span>(N <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">')'</span> [Description],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">       1 [<span style="color:#0000ff;">Level</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>   T_Primes</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Update</span> T_Tree <span style="color:#0000ff;">Set</span> [Description]=<span style="color:#0000ff;">Cast</span>(ID <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">'('</span>+<span style="color:#0000ff;">Cast</span>(Prime <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">')'</span> <span style="color:#0000ff;">Where</span> [<span style="color:#0000ff;">Level</span>]=1;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @I <span style="color:#0000ff;">Int</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Set</span> @I=2;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">While</span> @I&lt;=5</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Begin</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Print</span> @I;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    Insert</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Into</span>    T_Tree</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Select</span>  P.N,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            Tr.Prime*Tr.Multiply,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            [Description],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            @I [<span style="color:#0000ff;">Level</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">From</span>    T_Tree Tr</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Top</span> 10 *</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                <span style="color:#0000ff;">Where</span>   P.N&gt;Tr.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                <span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID) P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Where</span>   Tr.[<span style="color:#0000ff;">Level</span>]=@I-1;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Update</span> T_Tree <span style="color:#0000ff;">Set</span> [Description]=IsNull([Description]+<span style="color:#006080;">','</span>,<span style="color:#006080;">''</span>)+<span style="color:#0000ff;">Cast</span>(ID <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">'('</span>+<span style="color:#0000ff;">Cast</span>(Prime <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">')'</span> <span style="color:#0000ff;">Where</span> [<span style="color:#0000ff;">Level</span>]=@I;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Set</span> @I=@I+1;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">End</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Table</span> T_Tree</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Add</span> <span style="color:#0000ff;">Constraint</span> PK_T_Tree</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Primary</span> <span style="color:#0000ff;">Key</span> <span style="color:#0000ff;">Clustered</span> (Prime, Multiply);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">NonClustered</span> <span style="color:#0000ff;">Index</span> Idx_T_Tree_ID <span style="color:#0000ff;">ON</span> T_Tree(ID);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span> *</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>   T_Tree;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image005.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image005" src="http://gerireshef.files.wordpress.com/2012/01/clip_image005_thumb.jpg?w=475&#038;h=572" alt="clip_image005" width="475" height="572" border="0" /></a></p>
<p>עמודת Description כוללת מידע על הדרך עד לאותו קודקוד, ו-Level על הרמה שלו (שורש = 1). זהו מידע עזר בלבד לצורך ההדגמה, והמידע הדרוש לתפעול המודל יגזר מעמודות Prime ו-Multiply כאמור.</p>
<p>הנתונים כוללים 10 עצים נפרדים, שבכל אחד 5 רמות ולכל מנהל 10 בנים ישירים, ובסה&quot;כ מעל 100,000 שורות.</p>
<p>למשל- את הדרך מקודקוד נתון עד לקודקוד העליון נשלוף כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--העץ המתכנס</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=5555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  Tr1.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr2.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                               <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime);</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image007.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image007" src="http://gerireshef.files.wordpress.com/2012/01/clip_image007_thumb.jpg?w=478&#038;h=365" alt="clip_image007" width="478" height="365" border="0" /></a></p>
<p>השליפה מחפשת שורות שהמכפלה הנוכחית מתחלקת בהן (במכפלת עמודת הראשוני בעמודת המכפלה) ושהמנה אינה כוללת גורמים נוספים באמצע. כלומר- עבור ID=5555 שהמכפלה שלו 14993 מתקבלת מ-11*29*47 של שלושת קודמיו, לא נמנה עבורו את השורה בה המכפלה 11 והראשוני 47 כי 29 חסר באמצע, ובוודאי שלא שורות שבמכפלה או בראשוני שלהם יש ראשוני שהמכפלה 14993 אינה מתחלקת בהם.</p>
<p>הערה מתימטית שכדאי להוסיף- אלגוריתם ההצפנה RSA מבוסס על כך שלכפול שני מספרים ראשוניים זו משימה קלה יחסית למשימת פירוק המכפלה לגורמים (מפתח ההצפנה הפומבי מתבסס על מכפלה של שני ראשוניים, אבל רק מי שמכיר את הגורמים שלה- יוכל לפענח את הצופן), ואפשר לתהות אם אנו לא הולכים להסתבך בנקודה זו.. נכון, אלא שאלגוריתם RSA מתבסס על מכפלה של ראשוניים בני כמה עשרות ספרות, ואילו כאן מדובר בראשונים קטנים יחסית כאשר הגורמים האפשריים שלהם נשלפים מטבלה צנועה בגודלה ומאונדקסת. מדובר לדעתי בעומס לא גדול על ה-CPU.</p>
<p>מה עם הבעייה ההפוכה- העץ המתפרס מקודקוד מסויים (כלומר- כל העובדים הכפופים למנהל)?</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--העץ המתפרס</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  Tr2.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                               <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> Tr2.Prime;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image009.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image009" src="http://gerireshef.files.wordpress.com/2012/01/clip_image009_thumb.jpg?w=478&#038;h=441" alt="clip_image009" width="478" height="441" border="0" /></a></p>
<p>די דומה לשליפה הקודמת, עם השינוי המתבקש בתנאי.</p>
<p>את הפרטים של שורת השורש ניתן למצוא ב-Tr1 שאינו מוצג בשליפה, אבל אם לא נסתפק בזה ונרצה שגם היא תהיה חלק מהסט- אזי:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#008000;">-- העץ המתפרס כולל השורש</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  Tr2.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> (Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0 <span style="color:#0000ff;">Or</span> Tr2.ID=Tr1.ID)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                               <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> Tr2.ID;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image011.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image011" src="http://gerireshef.files.wordpress.com/2012/01/clip_image011_thumb.jpg?w=599&#038;h=453" alt="clip_image011" width="599" height="453" border="0" /></a></p>
<p>כיצד מוצאים את &quot;הנכדים&quot; של קודקוד נתון- שתי רמות ממנו?</p>
<p>(אני מזכיר- עמודת Level קיימת רק לצורך בקרה של ההדגמה ואינני עושה בה שימוש)</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--העץ המתפרס שתי רמות מעל - הנכדים של</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @Lvl <span style="color:#0000ff;">Int</span>=2;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  Tr2.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> (<span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Count</span>(*)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            <span style="color:#0000ff;">Where</span>  (Tr2.Multiply/Tr1.Multiply)%P.N=0)=@Lvl</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> Tr2.Prime;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image013.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image013" src="http://gerireshef.files.wordpress.com/2012/01/clip_image013_thumb.jpg?w=516&#038;h=521" alt="clip_image013" width="516" height="521" border="0" /></a></p>
<p>השליפה מוצאת את כל הצאצאים של הקודקוד, ומפעילה תנאי נוסף- מנת המכפלות צריכה להתחלק בשני ראשונים מהטבלה (כי מדובר בשתי רמות).</p>
<p>אם רוצים למחוק את כל תת העץ הנ&quot;ל אזי כך (אני פותח טרנזקציה ומבטל אותה כדי לא למחוק באמת אלא רק להמחיש שזה אפשרי):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--מחיקה של ענף ע"פ הנ"ל</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Begin</span> <span style="color:#0000ff;">Tran</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Delete</span>  Tr</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span>   ID <span style="color:#0000ff;">In</span> (<span style="color:#0000ff;">Select</span> Tr2.ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">              <span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">              <span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">              <span style="color:#0000ff;">Where</span>   Tr1.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                      <span style="color:#0000ff;">And</span> (Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0 <span style="color:#0000ff;">Or</span> Tr2.ID=Tr1.ID)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                      <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                      <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                                     <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                                     <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                                             <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                                             <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime));</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">RollBack</span>;</pre>
</div>
</div>
<p>את האב של עובד כלשהו ניתן למצוא כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--אב</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=55555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  <span style="color:#0000ff;">Top</span> 1 Tr1.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr2.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply=Tr1.Prime*Tr1.Multiply;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image015.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image015" src="http://gerireshef.files.wordpress.com/2012/01/clip_image015_thumb.jpg?w=423&#038;h=227" alt="clip_image015" width="423" height="227" border="0" /></a></p>
<p>ולסיום- &quot;בן הזקונים&quot;, כלומר- הבן האחרון, זה עם הראשוני הכי גדול, כך-</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--בן הזקונים</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  <span style="color:#0000ff;">Top</span> 1 Tr2.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply=Tr1.Prime*Tr1.Multiply</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> Prime <span style="color:#0000ff;">Desc</span>;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image017.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image017" src="http://gerireshef.files.wordpress.com/2012/01/clip_image017_thumb.jpg?w=421&#038;h=245" alt="clip_image017" width="421" height="245" border="0" /></a></p>
<p>השאילתה הזו תשמש אותנו בהמשך כשננסה להעביר ענף שלם ממקום למקום, ונצטרך למצוא לו מקום מתאים אחרי בן הזקונים בקודקוד היעד.</p>
<p>הוספת בנים לקודקוד:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--הוספת שורות</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Declare</span> @ID <span style="color:#0000ff;">Int</span>=555;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  P.N,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        Tr1.Prime*Tr1.Multiply Multiply,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        Tr1.[Description]+<span style="color:#006080;">','</span>+<span style="color:#0000ff;">Cast</span>(@@<span style="color:#0000ff;">Identity</span> <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">'('</span>+<span style="color:#0000ff;">Cast</span>(P.N <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>)+<span style="color:#006080;">')'</span> [Description],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        Tr1.[<span style="color:#0000ff;">Level</span>]+1 [<span style="color:#0000ff;">Level</span>],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        P.Mispar</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Outer</span> Apply (<span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Max</span>(Prime) Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">From</span>    T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            <span style="color:#0000ff;">Where</span>   Tr2.Multiply=Tr1.Prime*Tr1.Multiply) Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">Outer</span> Apply (<span style="color:#0000ff;">Select</span> N,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                                Row_Number() <span style="color:#0000ff;">Over</span>(<span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> P.N) Mispar</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                        <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                        <span style="color:#0000ff;">Where</span>   Tr2.Prime&lt;P.N) P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@ID;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image019.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image019" src="http://gerireshef.files.wordpress.com/2012/01/clip_image019_thumb.jpg?w=722&#038;h=420" alt="clip_image019" width="722" height="420" border="0" /></a></p>
<p>זו אינה פקודת Insert אלא Select. יש לעשות Join בינה לבין נתוני המקור לפי עמודת Mispar, להוסיף כמה בנים שצריך, ולזה לבצע Insert לטבלת T_Tree.</p>
<p>ולבסוף- העברת ענף. הפרוצדורה הבאה מקבלת שני פרמטרים- הקודקוד שאת הענף המתחיל ממנו (כולל אתו עצמו) יש להעביר, והקודקוד שיהיה האב החדש שלו (למשל- מינוי מנהל חדש למחלקה):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--העברת ענף</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">If</span> Object_Id(<span style="color:#006080;">'P_Move'</span>,<span style="color:#006080;">'P'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Proc</span> P_Move;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">Proc</span> P_Move @<span style="color:#0000ff;">From</span> <span style="color:#0000ff;">Int</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                   @<span style="color:#0000ff;">To</span> <span style="color:#0000ff;">Int</span>=<span style="color:#0000ff;">Null</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--P_Move 1,777</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Declare</span> @PrimeFrom <span style="color:#0000ff;">Int</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @PrimeTo <span style="color:#0000ff;">Int</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @PrimeFromID <span style="color:#0000ff;">Int</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @PrimeToID <span style="color:#0000ff;">Int</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @MultiplyFrom BigInt,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @MultiplyTo BigInt,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @MaxPrimeFrom <span style="color:#0000ff;">Int</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--הקודקוד שיש להעביר- המכפלה והראשוני שלו, ומקומו הסידורי של הראשוני בטבלת הראשוניים</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  @PrimeFrom=Tr.Prime,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @PrimeFromID=P.ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @MultiplyFrom=Multiply</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Inner</span> <span style="color:#0000ff;">Join</span> T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">On</span> Tr.Prime=P.N</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr.ID=@<span style="color:#0000ff;">From</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--הקודקוד שאליו יש לשרשר- המכפלה והראשוני שלו, ומקומו הסידורי של הראשוני בטבלת הראשונים</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">If</span> @<span style="color:#0000ff;">To</span> <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Select</span>  <span style="color:#0000ff;">Top</span> 1 @PrimeTo=Tr2.Prime,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            @PrimeToID=P.ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            @MultiplyTo=Tr2.Multiply</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Inner</span> <span style="color:#0000ff;">Join</span> T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">On</span> Tr2.Prime=P.N</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Where</span>   Tr1.ID=@<span style="color:#0000ff;">To</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">And</span> Tr2.Multiply=Tr1.Prime*Tr1.Multiply</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> Tr2.Prime <span style="color:#0000ff;">Desc</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Else</span> --אם היעד לא נתון- הענף הופך לעץ עצמאי ליד העצים העצמאיים שכבר קיימים</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Select</span>  @PrimeTo=<span style="color:#0000ff;">Min</span>(N),</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            @PrimeToID=<span style="color:#0000ff;">Min</span>(ID),</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            @MultiplyTo=1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">From</span>    T_Primes</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Where</span>   N&gt;IsNull((<span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Max</span>(Prime) Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">    <span style="color:#0000ff;">From</span>    T_Tree</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">    <span style="color:#0000ff;">Where</span>   Multiply=1),0);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--הראשוני הכי גדול בענף שמעבירים - יקל על הפירוק לגורמים בהמשך</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  @MaxPrimeFrom=<span style="color:#0000ff;">Max</span>(Tr2.Prime)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@<span style="color:#0000ff;">From</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--ערכי המשתנים שהוכנו לקראת ההעברה עצמה</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  @PrimeFrom [@PrimeFrom],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @PrimeFromID [@PrimeFromID],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @PrimeTo [@PrimeTo],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @PrimeToID [@PrimeToID],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @MultiplyTo [@MultiplyTo],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        @MultiplyFrom [@MultiplyFrom],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        @MaxPrimeFrom [@MaxPrimeFrom];</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--כל הראשונים ישתנו בהתאם לפער הראשונים בין המקור ליעד והמכפלה תתעדכן בהתאם</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">With</span> T <span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">(<span style="color:#0000ff;">Select</span> Tr2.*</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_Tree Tr1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> <span style="color:#0000ff;">Join</span> T_Tree Tr2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Where</span>   Tr1.ID=@<span style="color:#0000ff;">From</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> (Tr2.Multiply%(Tr1.Prime*Tr1.Multiply)=0 <span style="color:#0000ff;">Or</span> Tr2.ID=Tr1.ID)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">And</span> Tr1.Prime&lt;=Tr2.Prime</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Exists</span> (<span style="color:#0000ff;">Select</span> 1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                       <span style="color:#0000ff;">From</span>    T_Primes P</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                       <span style="color:#0000ff;">Where</span>   Tr2.Multiply%P.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                               <span style="color:#0000ff;">And</span> Tr1.Multiply%P.N&gt;0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">And</span> P.N&lt;Tr1.Prime))</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Update</span>  T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Set</span>     Prime=P.PrimeHadash,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        Multiply=Round(T.Multiply*P.SmLg/@MultiplyFrom*@MultiplyTo,0)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Output</span> <span style="color:#006080;">'Deleted'</span> Type,Deleted.*,<span style="color:#006080;">'Inserted'</span> Type,Inserted.* --השורות שהשתנו- לפני ואחרי השינוי</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> IsNull(Exp(<span style="color:#0000ff;">Sum</span>(Log(P2.N)-Log(P1.N))-Log(<span style="color:#0000ff;">Max</span>(P2.N))+Log(<span style="color:#0000ff;">Max</span>(P1.N))),1) SmLg,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                    <span style="color:#0000ff;">Max</span>(P1.N) PrimeYashan,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                    <span style="color:#0000ff;">Max</span>(P2.N) PrimeHadash</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            <span style="color:#0000ff;">From</span>    T_Primes P1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            <span style="color:#0000ff;">Inner</span> <span style="color:#0000ff;">Join</span> T_Primes P2</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                    <span style="color:#0000ff;">On</span> P1.ID=P2.ID+@PrimeFromID-@PrimeToID-1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            <span style="color:#0000ff;">Where</span>   P1.N <span style="color:#0000ff;">Between</span> @PrimeFrom <span style="color:#0000ff;">And</span> @MaxPrimeFrom</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                    <span style="color:#0000ff;">And</span> (T.Multiply%P1.N=0</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                        <span style="color:#0000ff;">Or</span> T.Prime=P1.N)) P;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p>הרעיון באופן כללי- נניח שהראשוני של קודקוד המקור הוא 7 (כלומר- ראשוני מספר 4 בטבלת הראשוניים),</p>
<p>ולקודקוד היעד יש כבר 2 בנים עם הראשוניים 7,11 (כלומר- מספרים 4 ו-5 בטבלת הראשוניים).</p>
<p>זה אומר שאת ראשוני המקור יש &quot;להקפיץ&quot; שני מקומות קדימה מ-7 (מקום 4) ל-13 (מקום 6),</p>
<p>וכך את כל שאר הראשוניים בענף (שני מקומות קדימה).</p>
<p>את המכפלות של כולם יש לחשב מחדש- מוצאים לכל אחד את הגורמים, ומחשבים את המכפלה שלהם בעזרת לוגריתמים (כתבתי על זה <a href="http://gerireshef.wordpress.com/2011/10/26/%d7%97%d7%99%d7%a9%d7%95%d7%91-%d7%a9%d7%99%d7%a0%d7%95%d7%99%d7%99%d7%9d-%d7%95%d7%a1%d7%99%d7%9b%d7%95%d7%9e%d7%99%d7%9d-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%a4%d7%95%d7%a0%d7%a7%d7%a6%d7%99%d7%95/">כאן</a> בחצי השני המתייחס למדד המחירים לצרכן).</p>
<p>אני מזכיר שוב שעמודות Description ו-Level נועדו רק לצורך הבנת ההדגמה, אינני עושה בהן שימוש, והפרוצדורה הנ&quot;ל אינה מעדכנת אותן.</p>
<p>בנוסף כדאי לציין שאם מעבירים ענף ממקום X למקום Y בעזרת הפרוצדורה, ולאחר מכן מעבירים בחזרה למקור; יש לשים לב לשתי נקודות:</p>
<p>1. לא סתם מחליפים את הפרמטרים במקומותיהם! יש לבדוק קודם לאיזה קודקוד הענף משורשר כרגע (בפרוצדורה מציינים את הקודקוד שהחל ממנו מעבירים ולא את זה אליו הוא משורשר); ורק אז להעביר אותו לקודקוד היעד ואחר כך לקודקוד המקור (הקודקוד שמעבירים הוא אותו אחד בשני המקרים. למשל-</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span> P_Move 560, 777;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Exec</span> P_Move 560, 55;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image021.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="clip_image021" src="http://gerireshef.files.wordpress.com/2012/01/clip_image021_thumb.jpg?w=722&#038;h=433" alt="clip_image021" width="722" height="433" border="0" /></a></p>
<p>2. כשהענף מועבר – קודקוד השורש שלו הופך לבן הזקונים של קודקוד היעד. כשהוא מוחזר- הוא הופך לבן הזקונים של קודקוד המקור. אם הוא לא היה מלכתחילה בן זקונים- הוא לא יחזור בדיוק לאותו מקום.. יש עוד מקום לשפר מעט את הפרוצדורה כך שתעביר לא לסוף אלא לראשוני הפנוי הראשון.</p>
<p>בדוגמה הנ&quot;ל אין בעייה כי מלכתחילה בחרתי בבן זקונים.</p>
<p>סיכום: אם אצטרך לממש מודל היררכי- לא אמציא את הגלגל מחדש ולא אשתמש בשיטה הזו.. מדובר בתרגיל, מעניין מדי פעם לבדוק רעיונות מקוריים, ומי יודע? לעיתים נמצא לרעיונות אלו שימוש לא צפוי.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1440/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1440/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1440/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1440&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/17/%d7%99%d7%a9%d7%95%d7%9d-%d7%94%d7%99%d7%a8%d7%a8%d7%9b%d7%99%d7%94-%d7%a2%d7%a5-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%9e%d7%a1%d7%a4%d7%a8%d7%99%d7%9d-%d7%a8%d7%90%d7%a9%d7%95%d7%a0%d7%99%d7%99%d7%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image001_thumb1.gif" medium="image">
			<media:title type="html">clip_image001</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image003_thumb.jpg" medium="image">
			<media:title type="html">clip_image003</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image005_thumb.jpg" medium="image">
			<media:title type="html">clip_image005</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image007_thumb.jpg" medium="image">
			<media:title type="html">clip_image007</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image009_thumb.jpg" medium="image">
			<media:title type="html">clip_image009</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image011_thumb.jpg" medium="image">
			<media:title type="html">clip_image011</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image013_thumb.jpg" medium="image">
			<media:title type="html">clip_image013</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image015_thumb.jpg" medium="image">
			<media:title type="html">clip_image015</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image017_thumb.jpg" medium="image">
			<media:title type="html">clip_image017</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image019_thumb.jpg" medium="image">
			<media:title type="html">clip_image019</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image021_thumb.jpg" medium="image">
			<media:title type="html">clip_image021</media:title>
		</media:content>
	</item>
		<item>
		<title>בדיקת טבלת Slowly Changing Dimension בעזרת פונקציית Lag</title>
		<link>http://gerireshef.wordpress.com/2012/01/13/%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%98%d7%91%d7%9c%d7%aa-slowly-changing-dimension-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%a4%d7%95%d7%a0%d7%a7%d7%a6%d7%99%d7%99%d7%aa-lag/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/13/%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%98%d7%91%d7%9c%d7%aa-slowly-changing-dimension-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%a4%d7%95%d7%a0%d7%a7%d7%a6%d7%99%d7%99%d7%aa-lag/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 20:54:00 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1414</guid>
		<description><![CDATA[פונקציית Lag – מחידושי SQL Server 2012 שניתן להתייחס בעזרתה לרשומות קודמות ללא Self Joins מסורבלים, מאפשרת בין היתר לבצע ביקורת איכות לטבלאות SCD בקלות רבה יותר. בפוסט שפרסמתי לאחרונה הופיע סקריפט ליצירת טבלה מתאימה, וכן שליפה למציאת שגיאות המבוססת על Group By. לא אחזור כאן על הסקריפט, אלא רק אראה כיצד ניתן להגיע לחריגים [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1414&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>פונקציית Lag – מחידושי SQL Server 2012 שניתן להתייחס בעזרתה לרשומות קודמות ללא Self Joins מסורבלים, מאפשרת בין היתר לבצע ביקורת איכות לטבלאות SCD בקלות רבה יותר.<br />
<a href="http://blogs.microsoft.co.il/blogs/gerireshef/archive/2012/01/08/GR20120108.aspx">בפוסט שפרסמתי לאחרונה</a> הופיע סקריפט ליצירת טבלה מתאימה, וכן שליפה למציאת שגיאות המבוססת על Group By.<br />
לא אחזור כאן על הסקריפט, אלא רק אראה כיצד ניתן להגיע לחריגים בקלות בעזרת הפונקציה Lag:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">With</span> T <span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">(<span style="color:#0000ff;">Select</span> *,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        Lag(EndDate,1,<span style="color:#0000ff;">Null</span>) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID <span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> StartDate) PreviousEndDate</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  *</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span>   PreviousEndDate+1&lt;&gt;StartDate</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        StartDate;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/image.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="image" src="http://gerireshef.files.wordpress.com/2012/01/image_thumb.png?w=643&#038;h=343" alt="image" width="643" height="343" border="0" /></a></p>
<p>יותר קצר וברור מהקודים בפוסטים הקודמים בנושא, והסיבה היחידה שנזקקתי לחסדי ה-CTE היא שהמערכת אינה מקבלת את PreviousEndDate ב-Where באופן ישיר (ובצדק!).</p>
<p>השוותי את התוצאות לאלו שהוחזרו בשיטת Self Join ש<a href="http://gerireshef.wordpress.com/2010/01/29/%D7%90%D7%99%D7%AA%D7%95%D7%A8-%D7%A9%D7%92%D7%99%D7%90%D7%95%D7%AA-%D7%91%D7%98%D7%91%D7%9C%D7%90%D7%95%D7%AA-slowly-changing-dimension/">הצגתי לפני כשנתיים</a> – והן זהות.</p>
<p>מה לגבי היעילות? לשליפת ה-Self Join מיותר להשוות – הנוכחית בוודאי עולה עליה גם מבחינת הביצועים וגם מבחינת סירבול הקוד; אך מה שליפת ה-Group By מלפני כשבוע?</p>
<p>ה-<a href="https://docs.google.com/open?id=0B3oLQpQ-LDOVYTQzNWZjYmMtMzJhNS00YzhjLWFkYzYtMjY4ZjA0NDIwM2E4">Execution Plan מצורף כאן</a>, והוא מתמחר את ה-Group By ב-39% ואת ה-Lag ב-61%, כלומר- הקודמת עדיפה.</p>
<p>יחד עם זאת- החדשה מחזירה את כל השגיאות ולא מציינת רק את ה-ID שלהן, ומה שלא פחות חשוב- התמחור של השאילתות עם פונקציות החלון החדשות שבגרסת 2012 מעט תמוה לעיתים, ובמקרה זה- אם אני מוותר על המיונים בסופי השאילתות- זו עם ה-Lag מתגלית כיעילה יותר.</p>
<p>כמובן שכדאי לבדוק גם מה קורה עם אינדקסים מתאימים.</p>
<p>ומה עם אלו שטרם התקינו את SQL 2012 בייצור (כלומר- כולם)? אפשר להיזכר ב<a href="http://gerireshef.wordpress.com/2011/07/17/%D7%91%D7%99%D7%A6%D7%95%D7%A2-lag-%D7%90%D7%95-lead-%D7%AA%D7%95%D7%9A-%D7%A4%D7%A0%D7%99%D7%94-%D7%90%D7%97%D7%AA-%D7%9C%D7%98%D7%91%D7%9C%D7%94/">דרך מתוחכמת לביצוע Lag תוך ביצוע Scan אחד על הטבלה</a> שניתן להשתמש בה מגרסת 2005 וצפונה, וליישם זאת בעזרתה..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1414/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1414/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1414/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1414&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/13/%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%98%d7%91%d7%9c%d7%aa-slowly-changing-dimension-%d7%91%d7%a2%d7%96%d7%a8%d7%aa-%d7%a4%d7%95%d7%a0%d7%a7%d7%a6%d7%99%d7%99%d7%aa-lag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>יעול שאילתת Union עצמי ודוגמה ליישום בבדיקת טבלת Slowly Changing Dimension</title>
		<link>http://gerireshef.wordpress.com/2012/01/08/%d7%99%d7%a2%d7%95%d7%9c-%d7%a9%d7%90%d7%99%d7%9c%d7%aa%d7%aa-union-%d7%a2%d7%a6%d7%9e%d7%99-%d7%95%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d-%d7%91%d7%91%d7%93%d7%99%d7%a7/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/08/%d7%99%d7%a2%d7%95%d7%9c-%d7%a9%d7%90%d7%99%d7%9c%d7%aa%d7%aa-union-%d7%a2%d7%a6%d7%9e%d7%99-%d7%95%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d-%d7%91%d7%91%d7%93%d7%99%d7%a7/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 18:18:05 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1408</guid>
		<description><![CDATA[Union עצמי הוא Union של טבלה עם עצמה – כשרוצים למשל לאחד נתונים ממספר עמודות, וכדי שזה לא ישאר ברמה הטכנית – אני אדגים כיצד לבדוק תקינות טבלת Slowly Changing (להלן- SCD) בעזרתה. לפני כשנתיים כתבתי פוסט על SCD, הסברתי בקצרה מה זה, ונתתי והדגמתי כיצד לבדוק את תקינותה ולחפש שגיאות. בטבלאות SCD יש שתי [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1408&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Union עצמי הוא Union של טבלה עם עצמה – כשרוצים למשל לאחד נתונים ממספר עמודות,<br />
וכדי שזה לא ישאר ברמה הטכנית – אני אדגים כיצד לבדוק תקינות טבלת Slowly Changing (להלן- SCD) בעזרתה.</p>
<p>לפני כשנתיים כתבתי <a href="http://gerireshef.wordpress.com/2010/01/29/%d7%90%d7%99%d7%aa%d7%95%d7%a8-%d7%a9%d7%92%d7%99%d7%90%d7%95%d7%aa-%d7%91%d7%98%d7%91%d7%9c%d7%90%d7%95%d7%aa-slowly-changing-dimension/">פוסט על SCD</a>, הסברתי בקצרה מה זה, ונתתי והדגמתי כיצד לבדוק את תקינותה ולחפש שגיאות.<br />
בטבלאות SCD יש שתי עמודות תאריכים – תאריך התחלה ותאריך סיום, ונניח שאנחנו רוצים לקבל רשימה של כל התאריכים בעמודה אחת. ניצור שוב את הטבלה ונוסיף עוד כמה שורות כדי שיהיה יותר מעניין:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Use</span> TempDB;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">If</span> Object_Id(<span style="color:#006080;">'T_SCD'</span>,<span style="color:#006080;">'U'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> T_SCD;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">Table</span> T_SCD(ID <span style="color:#0000ff;">Int</span>, StartDate DateTime, EndDate DateTime);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--1 תקין</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 1 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090731'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 1 ID, <span style="color:#006080;">'20090801'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 1 ID, <span style="color:#006080;">'20090816'</span> StartDate, <span style="color:#006080;">'20091031'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 1 ID, <span style="color:#006080;">'20091101'</span> StartDate, <span style="color:#006080;">'20091231'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--2 רשומה אחת "חותכת" את האחרת</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 2 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090731'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 2 ID, <span style="color:#006080;">'20090801'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 2 ID, <span style="color:#006080;">'20090810'</span> StartDate, <span style="color:#006080;">'20091031'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 2 ID, <span style="color:#006080;">'20091101'</span> StartDate, <span style="color:#006080;">'20091231'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--3 רשומה אחת "בולעת" את האחרת</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 3 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 3 ID, <span style="color:#006080;">'20090801'</span> StartDate, <span style="color:#006080;">'20090810'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 3 ID, <span style="color:#006080;">'20090816'</span> StartDate, <span style="color:#006080;">'20091031'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 3 ID, <span style="color:#006080;">'20091101'</span> StartDate, <span style="color:#006080;">'20091231'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--4 רשומות חופפות</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 4 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 4 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 4 ID, <span style="color:#006080;">'20090816'</span> StartDate, <span style="color:#006080;">'20091031'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 4 ID, <span style="color:#006080;">'20091101'</span> StartDate, <span style="color:#006080;">'20091231'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--5 יש "חור" באמצע</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 5 ID, <span style="color:#006080;">'20090101'</span> StartDate, <span style="color:#006080;">'20090731'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 5 ID, <span style="color:#006080;">'20090801'</span> StartDate, <span style="color:#006080;">'20090815'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 5 ID, <span style="color:#006080;">'20090816'</span> StartDate, <span style="color:#006080;">'20091031'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 5 ID, <span style="color:#006080;">'20091201'</span> StartDate, <span style="color:#006080;">'20091231'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--6 תאריך ההתחלה אחרי תאריך הסיום</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 6 ID, <span style="color:#006080;">'20090131'</span> StartDate, <span style="color:#006080;">'20090121'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--7 עוד אחד תקין</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 7 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120103'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 7 ID, <span style="color:#006080;">'20120104'</span> StartDate, <span style="color:#006080;">'20120105'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 7 ID, <span style="color:#006080;">'20120106'</span> StartDate, <span style="color:#006080;">'20120108'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 7 ID, <span style="color:#006080;">'20120109'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--8 שתי תקופות חופפות מיותרות באמצע</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 8 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120103'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 8 ID, <span style="color:#006080;">'20120104'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 8 ID, <span style="color:#006080;">'20120105'</span> StartDate, <span style="color:#006080;">'20120106'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 8 ID, <span style="color:#006080;">'20120105'</span> StartDate, <span style="color:#006080;">'20120106'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--9 שתי תקופות חופפות בתוך חור באמצע</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 9 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120103'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 9 ID, <span style="color:#006080;">'20120108'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 9 ID, <span style="color:#006080;">'20120105'</span> StartDate, <span style="color:#006080;">'20120106'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 9 ID, <span style="color:#006080;">'20120105'</span> StartDate, <span style="color:#006080;">'20120106'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--10 שני זוגות של תקופות חופפות</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 10 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120102'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 10 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120102'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 10 ID, <span style="color:#006080;">'20120105'</span> StartDate, <span style="color:#006080;">'20120106'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 10 ID, <span style="color:#006080;">'20120109'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 10 ID, <span style="color:#006080;">'20120109'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--11 עוד אחד תקין</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert <span style="color:#0000ff;">Into</span> T_SCD <span style="color:#0000ff;">Select</span> 11 ID, <span style="color:#006080;">'20120101'</span> StartDate, <span style="color:#006080;">'20120110'</span> EndDate;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  *</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        StartDate;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image0021.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image002" src="http://gerireshef.files.wordpress.com/2012/01/clip_image002_thumb1.jpg?w=624&#038;h=714" alt="clip_image002" width="624" height="714" border="0" /></a></p>
<p>הפתרון המקובל הוא לבצע Union כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        StartDate [<span style="color:#0000ff;">Date</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Union</span> <span style="color:#0000ff;">All</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        EndDate [<span style="color:#0000ff;">Date</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        [<span style="color:#0000ff;">Date</span>];</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image0041.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image004" src="http://gerireshef.files.wordpress.com/2012/01/clip_image004_thumb1.jpg?w=256&#038;h=428" alt="clip_image004" width="256" height="428" border="0" /></a></p>
<p>פתרון חלופי הוא להשתמש <a href="http://gerireshef.wordpress.com/2011/07/26/%d7%94%d7%90%d7%95%d7%a4%d7%a8%d7%98%d7%95%d7%a8-values/">באופרטור Values</a>:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        T1.[<span style="color:#0000ff;">Date</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD T</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> (<span style="color:#0000ff;">Values</span>(T.StartDate),(T.EndDate)) <span style="color:#0000ff;">AS</span> D([<span style="color:#0000ff;">Date</span>])) T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        [<span style="color:#0000ff;">Date</span>];</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image0061.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image006" src="http://gerireshef.files.wordpress.com/2012/01/clip_image006_thumb1.jpg?w=661&#038;h=380" alt="clip_image006" width="661" height="380" border="0" /></a></p>
<p>מה יותר יעיל?</p>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image0081.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image008" src="http://gerireshef.files.wordpress.com/2012/01/clip_image008_thumb1.jpg?w=701&#038;h=283" alt="clip_image008" width="701" height="283" border="0" /></a></p>
<p>מכיוון שבשאילתה השניה יש רק Table Scan אחד (ולא שניים כמו בראשונה) – היא יותר יעילה, ולא אתמקח על המחיר המופקע שדפקו לי ב-Sort..</p>
<p>כיצד ניתן לייעל בעזרת Union עצמי שכזה בדיקה של SCD? הבדיקה שהצעתי לפני שנתיים- כבודה במקומה מונח, והיא מובילה אותנו ישר לשורות השגויות – אם יש. דרך חלופית ויעילה יותר היא לבצע Group By לעיין בשני הסיכומים הבאים:</p>
<p>1. לבדוק שסך כל אורכי התקופות של כל ID שווה לאורך התקופה שבין ההתחלה (תאריך מינימלי) והסיום (תאריך מקסימלי), דבר שלא יקרה אם יש חפיפות או חורים באמצע.</p>
<p>2. מכיוון שיכול להיות שיש גם חפיפה וגם חור שמקזזים זה את זה וכו' – נבדוק גם שכל תאריך מופיע פעמיים – פעם בסוף תקופה ופעם בתחילת התקופה שאחריו, חוץ מתאריך ההתחלה ותאריך הסיום שמופיעים פעם אחת כל אחד (למען הדיוק- לתאריך הסיום יש להוסיף יום אחד כדי שיהיה שווה לתאריך הפתיחה העוקב).</p>
<p>קצת מורכב, ולכן נבנה זאת שלב אחר שלב- נתחיל בGroup By לפי ID ותאריך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        [<span style="color:#0000ff;">Date</span>],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Sum</span>(DateDiff(<span style="color:#0000ff;">Day</span>,StartDate,EndDate+1)) SDD,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Min</span>(StartDate) Mn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Max</span>(EndDate)+1 Mx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Min</span>(<span style="color:#0000ff;">Min</span>(StartDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID) MnMn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Max</span>(<span style="color:#0000ff;">Max</span>(EndDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID)+1 MxMx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Count</span>(*) Cnt</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD T</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> (<span style="color:#0000ff;">Values</span>(T.StartDate),(T.EndDate+1)) <span style="color:#0000ff;">AS</span> D([<span style="color:#0000ff;">Date</span>])) T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        [<span style="color:#0000ff;">Date</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        [<span style="color:#0000ff;">Date</span>];</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image010.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image010" src="http://gerireshef.files.wordpress.com/2012/01/clip_image010_thumb.jpg?w=702&#038;h=492" alt="clip_image010" width="702" height="492" border="0" /></a></p>
<p>ID – עמודת Group By.</p>
<p>Date – עמודת Group By.</p>
<p>SDD – (כלומר ה-Sum של DateDiff) מסכם את אורכי התקופות. בהמשך נחלק את זה ב-2 כי כל תקופה מסוכמת פעמיים- פעם בתאריך ההתחלה ופעם בתאריך הסיום.</p>
<p>Mn – התאריך המינימלי. בהמשך נשתמש בו למציאת התקופה הראשונה בכל ID.</p>
<p>Mx – התאריך המקסימלי. בהמשך נשתמש בו למציאת התקופה האחרונה בכל ID.</p>
<p>MnMn – התאריך המינימלי של ה-ID, כלומר- תאריך ההתחלה שלו.</p>
<p>MxMx – התאריך המקסימלי של ה-ID, כלומר- תאריך הסיום שלו.</p>
<p>Cnt – ה-Count. ישמש לבדוק האם תאריכי ההתחלה והסיום של כל ID הופיעו פעם אחת, וכל השאר פעמיים.</p>
<p>כעת נבצע Group By לפי ID כשהשליםה הנ&quot;ל היא ה-T1 ב-CTE (כמובן- ללא ה-Order By):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">With</span> T1 <span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">(<span style="color:#0000ff;">Select</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        [<span style="color:#0000ff;">Date</span>],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Sum</span>(DateDiff(<span style="color:#0000ff;">Day</span>,StartDate,EndDate+1)) SDD,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Min</span>(StartDate) Mn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Max</span>(EndDate)+1 Mx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Min</span>(<span style="color:#0000ff;">Min</span>(StartDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID) MnMn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Max</span>(<span style="color:#0000ff;">Max</span>(EndDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID)+1 MxMx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Count</span>(*) Cnt</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> (<span style="color:#0000ff;">Values</span>(T.StartDate),(T.EndDate+1)) <span style="color:#0000ff;">AS</span> D([<span style="color:#0000ff;">Date</span>])) T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        [<span style="color:#0000ff;">Date</span>])</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Sum</span>(SDD)/2 SDD,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        DateDiff(<span style="color:#0000ff;">Day</span>,<span style="color:#0000ff;">MIN</span>(Mn),<span style="color:#0000ff;">MAX</span>(Mx)) DDs,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Sum</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> [<span style="color:#0000ff;">Date</span>]=MnMn <span style="color:#0000ff;">Then</span> Cnt <span style="color:#0000ff;">End</span>) SmMn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Sum</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> [<span style="color:#0000ff;">Date</span>]=MxMx <span style="color:#0000ff;">Then</span> Cnt <span style="color:#0000ff;">End</span>) SmMx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Count</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> Mn&lt;&gt;MnMn <span style="color:#0000ff;">And</span> Mx&lt;&gt;MxMx <span style="color:#0000ff;">And</span> Cnt&lt;&gt;2 <span style="color:#0000ff;">Then</span> 1 <span style="color:#0000ff;">End</span>) CntEls</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> ID</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image012.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image012" src="http://gerireshef.files.wordpress.com/2012/01/clip_image012_thumb.jpg?w=676&#038;h=662" alt="clip_image012" width="676" height="662" border="0" /></a></p>
<p>ID – העמודה לפיה מתבצע Group By.</p>
<p>SDD – סיכום של סיכום אורכי התקופות (מחולק ב-2 כי כל תקופה סוכמה פעמיים).</p>
<p>DDS – (כלומר ה-DateDiff של הסיכומים) ההפרש בימים בין תאריך ההתחלה ותאריך הסיום של ה-ID כולו (אמור להיות שווה ל-SDD).</p>
<p>SmMn – כמה פעמים הופיע תאריך ההתחלה של ה-ID (אמור להיות שווה 1).</p>
<p>SmMx – כמה פעמים הופיע תאריך הסיום של ה-ID (אמור להיות שווה 1).</p>
<p>CntEls – כמה Count יש שאינם תאריך התחלה או סיום של ה-ID וגם אינם שווים 2 (אמור להיות שווה 0).</p>
<p>נבדוק מי אינו מקיים את התנאים (=החריגים), ולשם כך נגדיר את השליפה מ-T1 בתור T2:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">With</span> T1 <span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">(<span style="color:#0000ff;">Select</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        [<span style="color:#0000ff;">Date</span>],</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Sum</span>(DateDiff(<span style="color:#0000ff;">Day</span>,StartDate,EndDate+1)) SDD,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Min</span>(StartDate) Mn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Max</span>(EndDate)+1 Mx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Min</span>(<span style="color:#0000ff;">Min</span>(StartDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID) MnMn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Max</span>(<span style="color:#0000ff;">Max</span>(EndDate)) <span style="color:#0000ff;">Over</span>(Partition <span style="color:#0000ff;">By</span> ID)+1 MxMx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Count</span>(*) Cnt</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T_SCD T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Cross</span> Apply (<span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> (<span style="color:#0000ff;">Values</span>(T.StartDate),(T.EndDate+1)) <span style="color:#0000ff;">AS</span> D([<span style="color:#0000ff;">Date</span>])) T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        [<span style="color:#0000ff;">Date</span>]),</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">T2 <span style="color:#0000ff;">As</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">(<span style="color:#0000ff;">Select</span> ID,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Sum</span>(SDD)/2 SDD,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        DateDiff(<span style="color:#0000ff;">Day</span>,<span style="color:#0000ff;">MIN</span>(Mn),<span style="color:#0000ff;">MAX</span>(Mx)) DDs,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Sum</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> [<span style="color:#0000ff;">Date</span>]=MnMn <span style="color:#0000ff;">Then</span> Cnt <span style="color:#0000ff;">End</span>) SmMn,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Sum</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> [<span style="color:#0000ff;">Date</span>]=MxMx <span style="color:#0000ff;">Then</span> Cnt <span style="color:#0000ff;">End</span>) SmMx,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        <span style="color:#0000ff;">Count</span>(<span style="color:#0000ff;">Case</span> <span style="color:#0000ff;">When</span> [<span style="color:#0000ff;">Date</span>]&lt;&gt;MnMn <span style="color:#0000ff;">And</span> [<span style="color:#0000ff;">Date</span>]&lt;&gt;MxMx <span style="color:#0000ff;">And</span> Cnt&lt;&gt;2 <span style="color:#0000ff;">Then</span> 1 <span style="color:#0000ff;">End</span>) CntEls</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    T1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> ID)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  *</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    T2</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span> SDD&lt;&gt;DDS</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">      <span style="color:#0000ff;">Or</span> (SmMn&lt;&gt;1</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">         <span style="color:#0000ff;">Or</span> SmMx&lt;&gt;1</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">         <span style="color:#0000ff;">Or</span> CntEls&gt;0)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> ID;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image014.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image014" src="http://gerireshef.files.wordpress.com/2012/01/clip_image014_thumb.jpg?w=702&#038;h=694" alt="clip_image014" width="702" height="694" border="0" /></a></p>
<p>כלומר: 2,3,4,5,8,9,10 הם השגויים (גם 6 שגוי ומי שרוצה גם את השגיאות &quot;הפנימיות&quot; יכול להוסיף תנאי SDD שלילי).</p>
<p>התסבוכת הזו שווה לנו? נשווה אותה לבדיקה מהפוסט הקודם:</p>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image016.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="clip_image016" src="http://gerireshef.files.wordpress.com/2012/01/clip_image016_thumb.jpg?w=701&#038;h=328" alt="clip_image016" width="701" height="328" border="0" /></a></p>
<p>השאילתה הישנה כבדה פי שלושה מהחדשה, שוב- בגלל החסכון ב-Table Scan (על מחיר ה-Sort כבר התבכיינתי?).</p>
<p>שתי הסתייגויות לפני שרצים לשנות את ה-QC בייצור:</p>
<p>1. השאילתה הישנה לא רק מצאה באילו ID יש שגיאות, אלא גם את השורות השגויות; והחדשה רק באילו ID יש שגיאות, ובאלו שכן- יש לחפש נקודתית את השורות השגויות.</p>
<p>2. טבלאות SCD יכולות להופיע בכל מיני קונפיגורציות, ואני טיפלתי כאן במקרה ספציפי בו יש תאריכי התחלה וסיום בכל שורה (ניתן להסתפק בתאריכי התחלה בתנאים מסויימים), והם מצויינים במפורש (לעיתים לא מציינים את תאריך הסיום בתקופה השוטפת). במקרים אחרים יש לשנות את השליפות בהתאם לצורך.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1408/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1408&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/08/%d7%99%d7%a2%d7%95%d7%9c-%d7%a9%d7%90%d7%99%d7%9c%d7%aa%d7%aa-union-%d7%a2%d7%a6%d7%9e%d7%99-%d7%95%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d-%d7%91%d7%91%d7%93%d7%99%d7%a7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image002_thumb1.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image004_thumb1.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image006_thumb1.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image008_thumb1.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image010_thumb.jpg" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image012_thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image014_thumb.jpg" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image016_thumb.jpg" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>
	</item>
		<item>
		<title>Service Broker &#8211; דוגמה ליישום</title>
		<link>http://gerireshef.wordpress.com/2012/01/04/service-broker-%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/04/service-broker-%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 19:07:34 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1389</guid>
		<description><![CDATA[ברוב הדוגמאות של Service Broker (להלן SB) שניתן לפגוש במאמרים שונים, Tutorials, והרצאות- נותנים דוגמה כיצד מעבירים הודעות בין שני Services: מגדירים אובייקטים (Message Type, Contract, Queue וכו'), שולחים הודעת Hello World דרך חלון ה-SSMS, פותחים חלון נוסף בו מושכים את ההודעה ושולחים הודעת תגובה, וכו': Queue הוא תור של הודעות, דומה קצת לטבלה. Contract [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1389&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>ברוב הדוגמאות של Service Broker (להלן SB) שניתן לפגוש במאמרים שונים, Tutorials, והרצאות- נותנים דוגמה כיצד מעבירים הודעות בין שני Services: מגדירים אובייקטים (Message Type, Contract, Queue וכו'), שולחים הודעת Hello World דרך חלון ה-SSMS, פותחים חלון נוסף בו מושכים את ההודעה ושולחים הודעת תגובה, וכו':</p>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image001.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="clip_image001" src="http://gerireshef.files.wordpress.com/2012/01/clip_image001_thumb.gif?w=747&#038;h=180" alt="clip_image001" width="747" height="180" border="0" /></a><br />
Queue הוא תור של הודעות, דומה קצת לטבלה.<br />
Contract מאפשר להעביר הודעות מהסוג שהוגדר ב-Message Type (ניתן להגדיר מספר Message Types לכל Contract).<br />
Service יוצר קשר בין Queue ל-Contract, או לחילופין- Contract יוצר קשר בין Queues דרך ה-Services שלהם (ניתן להגדיר מספר Contracts בכל Service ל-Queue אחד). הקשר נוצר ביצירת ה-Service בו מוגדר Queue אחד ומספר כלשהו של Contracts.<br />
העברת הודעה מ-Service 1 ל-Queue 2 נעשית בעזרת Dialog שנפתח בפרוצדורה ששולחת אותה, ונסגר בפרוצדורה שמקבלת אותה (את ההודעה).<br />
כדאי לעיין בפוסטים שמצויינים בהמשך כדי לראות איך פקודות ה-Create השונות של האובייקטים נראות, וכן כיצד מנוהל ה-Dialog.</p>
<p>לא התעסקתי מעולם עם היכולות האלו, במבט ראשון לא כל כך ברור על מה המהומה – הרי הייתי יכול לממש אותו הדבר עם טבלה, אבל במחשבה שנייה אני מבין שזו תשתית שמאפשרת תקשורת יעודית עם יכולות ספציפיות ולא סתם לשלוח הודעות סתמיות בין שני Services.<br />
מה שכן עניין אותי הוא יכולת פחות מוכרת של ה-SB להפעיל פרוצדורה ב&quot;צד השני&quot;: במקום לשלוח הודעה ולהמתין שבצד השני ימשכו אותה, נשלח הודעה שתפעיל פרוצדורה; כלומר- אנחנו נדחוף במקום שהם ימשכו..<br />
לי הדבר פתר בעייה ישנה שבעבר פתרתי אותה עם Jobs של הפעלה אסינכרונית של פרוצדורות, כלומר- היכולת להפעיל פרוצדורה ולאפשר לקוד להמשיך הלאה במקביל מבלי להמתין שהריצה שלה תסתיים. אינני יודע אם זו הייתה &quot;כוונת המשורר&quot; – לגבי ג'ובים הם בוודאי לא נועדו לכך, ולגבי SB- אינני יודע.<br />
בכל מקרה- ל-SB יש יתרון בולט על פני שימוש בג'וב להרצה אסינכרונית בכך שהוא מאפשר כמה ריצות במקביל, בעוד שהג'וב לא (ג'וב לא יכול להיות מופעל בו זמנית עם עצמו בניגוד לפרוצדורה באופן כללי או כפי שציינתי- כזו שמופעלת דרך SB).</p>
<p>לפני למעלה משנתיים פרסמתי פוסט בנושא ב-<a href="http://www.sqlserver.co.il/?p=1023">http://www.sqlserver.co.il</a> (ומאוחר יותר גם אצלי ב<a href="http://gerireshef.wordpress.com/2010/05/27/%d7%94%d7%a8%d7%a6%d7%94-%d7%90%d7%a1%d7%99%d7%a0%d7%9b%d7%a8%d7%95%d7%a0%d7%99%d7%aa-%d7%a9%d7%9c-%d7%a4%d7%a8%d7%95%d7%a6%d7%93%d7%95%d7%a8%d7%95%d7%aa-%d7%91%d7%90%d7%9e%d7%a6%d7%a2%d7%95%d7%aa-ser/">בלוג</a>), והנה נקרתה לי ההזדמנות להשתמש בזה: במקום העבודה שלי יש תהליכים שונים שרצים ואשר מופעלים על ידי פרוצדורה מרכזית שמקבלת כפרמטר את מספר התהליך. יש מספר מפתחים עם הרשאות אדמיניסטרטור, משיקולים ברורים רוצים לצמצם את ההרשאות למינימום ההכרחי, ובין היתר לא לאפשר הפעלה ישירה של הפרוצדורה בסביבות הפיתוח והבדיקות. הפתרון שהוצע היה ליצור טבלה לתוכה כל מפתח יזין את מספר התהליך שברצונו להריץ, ובמקביל יופעל ג'וב כל מספר דקות שיקרא שורה לא מטופלת מהטבלה, ויפעיל את התהליך (כרגע לא משנה מה הרוויחו בכך שחסמו את הגישה לפרוצדורה ואפשרו גישה לטבלה).<br />
החסרון הוא כמובן שצריך להמתין מספר דקות עד שהג'וב יפעיל את התהליך, ולעיתים – אם הג'וב רץ בדיוק על תהליך ארוך יותר – הרבה יותר זמן.<br />
הצעתי להשתמש ב-SB ובניתי מערכת שהתבססה פחות או יותר על הדוגמה מהפוסט, כמובן- עם השינויים הנדרשים.<br />
כצפוי- במציאות נוצרות בעיות שלא תמיד חושבים עליהן כשבונים דוגמה סטרילית עבור פוסט, ואלו העיקריות:</p>
<p><span style="text-decoration:underline;">קינפוג</span>- כדי לקנפג את הדטבייס באופן חד פעמי לשימוש ב-SB (על ידי Alter Database MyDatabase Set Enable_Broker;) יש לנתק את כולם ממנו.</p>
<p><span style="text-decoration:underline;">פרמטרים</span>- ב-Queue המקבל (MyTargetQueue) הוגדרה הפרוצדורה שצריכה להיות מופעלת כשדוחפים לו הודעה, אבל לא ניתן להעביר לה פרמטרים. הבעייה נפתרה על ידי כך שהפרמטרים נכללו בתור XML בהודעה שנשלחה (בפוסט אצלי בבלוג הדגמתי כיצד לשלוף אותם מה-XML בפרוצדורה P_MySrvBrkProc).</p>
<p><span style="text-decoration:underline;">הרשאות</span>- למפתחים יש הרשאות רק להכנסת נתונים לטבלה, וליתר דיוק- להפעלת פרוצדורה שמכניסה שורה לטבלה, ומעבירה Message לצד השני (שגורם לפרוצדורת היעד P_MySrvBrkProc הנ&quot;ל להיות מופעלת באופן אסינכרוני).<br />
פרוצדורת היעד מופעלת על ידי המערכת עם הרשאות Owner (dbo בדרך כלל) כפי שהוגדר ב- MyTargetQueueהמקבל.<br />
למפתח אין הרשאות להפעיל אותה.</p>
<p><span style="text-decoration:underline;">Trace</span>- כשמריצים פרוצדורה רוצים לראות את הפלט שלה (פקודות Print לצורך מעקב שכלולות בה, הודעות שגיאה וכו') – בעיקר בשלב הפיתוח, אבל לא רק. לו היינו מפעילים אותה כמתוכנן מלכתחילה דרך ג'וב – ניתן היה להפנות את הפלט לקובץ, אך מה נעשה כשהפרוצדורה מופעלת על ידי SB &quot;מאחורי הקלעים&quot;?<br />
הפתרון שנמצא היה להפעיל אותה דרך שורת הפקודה בעזרת SQLCmd ולהפנות את הפלט לקובץ, כאשר ה-SQLCmd עצמו הופעל בעזרת XP_CmdShell (הפקודה נבנית בתוך פרוצדורת היעד בעזרת הפרמטרים שהועברו אליה):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span> XP_CmdShell <span style="color:#006080;">'sqlcmd -E -S MyServer -d MyDatabase -Q "Exec MyDatabase.dbo.MyProcedure @MyVariable=1;" &gt; C:\MyLogDir\MyLogFile.txt'</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p>כלומר- פרוצדורת היעד אינה זו שמפעילה את התהליך, אלא פרוצדורה ש&quot;עוטפת&quot; את הפרוצדורה שמפעילה את התהליך ומפעילה אותה בעזרת XP_CmdShell ו-SQLCmd עם הפרמטרים שהועברו ב-Message.</p>
<p>לסיום- זה אינו פוסט עם קוד: הפוסט עם הקוד הוא זה אליו הפניתי למעלה, ופוסט זה נועד להוסיף מעט רקע, רציונל, מורשת קרב וכו'.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1389/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1389/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1389/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1389&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/04/service-broker-%d7%93%d7%95%d7%92%d7%9e%d7%94-%d7%9c%d7%99%d7%99%d7%a9%d7%95%d7%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image001_thumb.gif" medium="image">
			<media:title type="html">clip_image001</media:title>
		</media:content>
	</item>
		<item>
		<title>פתרון לבעיית ה-Pivot הדינאמי (2)</title>
		<link>http://gerireshef.wordpress.com/2012/01/01/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99-2/</link>
		<comments>http://gerireshef.wordpress.com/2012/01/01/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99-2/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 19:27:29 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1383</guid>
		<description><![CDATA[כנראה שסוף טוב הכל טוב- לאחר שבפוסט קודם מצאתי פתרון רעוע שהיווה יותר אתגר טכני מאשר פתרון אמין- הפעם מדובר בפתרון יציב ואמין (עד כמה שהספקתי לבדוק אותו): במקום להתבסס על פקודת ה-Pivot החדשה יחסית, נשתמש דווקא בשיטה הישנה יותר- בניית SQL דינאמי. עד 2005 הפתרון היה נראה בערך כך: Declare @SQL NVarchar(Max); Select @SQL=Isnull(@SQL+','+Char(13)+Char(9)+Char(9),'')+'Count(Case [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1383&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>כנראה שסוף טוב הכל טוב- לאחר <a href="http://gerireshef.wordpress.com/2011/12/20/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99/">שבפוסט קודם</a> מצאתי פתרון רעוע שהיווה יותר אתגר טכני מאשר פתרון אמין- הפעם מדובר בפתרון יציב ואמין (עד כמה שהספקתי לבדוק אותו): במקום להתבסס על פקודת ה-Pivot החדשה יחסית, נשתמש דווקא בשיטה הישנה יותר- בניית SQL דינאמי.<br />
עד 2005 הפתרון היה נראה בערך כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Declare</span> @<span style="color:#0000ff;">SQL</span> NVarchar(<span style="color:#0000ff;">Max</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  @<span style="color:#0000ff;">SQL</span>=Isnull(@<span style="color:#0000ff;">SQL</span>+<span style="color:#006080;">','</span>+<span style="color:#0000ff;">Char</span>(13)+<span style="color:#0000ff;">Char</span>(9)+<span style="color:#0000ff;">Char</span>(9),<span style="color:#006080;">''</span>)+<span style="color:#006080;">'Count(Case When type_desc='</span><span style="color:#006080;">''</span>+type_desc+<span style="color:#006080;">''</span><span style="color:#006080;">' Then 1 End) As ['</span>+type_desc+<span style="color:#006080;">']'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    sys.objects</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Group</span> <span style="color:#0000ff;">By</span> type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  @<span style="color:#0000ff;">SQL</span>=<span style="color:#006080;">'Select Schema_id,'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">             <span style="color:#0000ff;">Char</span>(9)+<span style="color:#0000ff;">Char</span>(9)+@<span style="color:#0000ff;">SQL</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">             <span style="color:#006080;">'From sys.objects'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">             <span style="color:#006080;">'Group By Schema_id;'</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Print</span> @<span style="color:#0000ff;">SQL</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Exec</span>(@<span style="color:#0000ff;">SQL</span>);</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image002.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image002" src="http://gerireshef.files.wordpress.com/2012/01/clip_image002_thumb.jpg?w=702&#038;h=510" alt="clip_image002" width="702" height="510" border="0" /></a></p>
<p>למען האמת- כשפגשתי לראשונה את הפתרון בשיטת ה-SQL הדינאמי בימי גרסת 2000 העליזים – זה התחיל עם Cursor שעבר על כל ערכי type_desc ובנה כך את ה-SQL, ואינני זוכר אם שיטת השרשור הזו בעזרת Select לתוך משתנה פעלה אז, אבל בשורה התחתונה- קיבלנו SQL דינאמי.</p>
<p>את כל זה נעטוף כעת ב-SP_ExecuteSQL תוך שאנחנו מכפילים את כל ה'תגים' שבתוך הפקודה (ומשמיטים את פקודת ה-Print):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span> SP_ExecuteSQL N<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Declare @SQL Varchar(Max);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Select  @SQL=Isnull(@SQL+'<span style="color:#006080;">','</span><span style="color:#006080;">'+Char(13)+Char(9)+Char(9),'</span><span style="color:#006080;">''</span><span style="color:#006080;">')+'</span><span style="color:#006080;">'Count(Case When type_desc='</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">' Then 1 End) As ['</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">']'</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">From    sys.objects</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Group By type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Select  @SQL='<span style="color:#006080;">'Select Schema_id,'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">             Char(9)+Char(9)+@SQL+Char(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">             '<span style="color:#006080;">'From sys.objects'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">             '<span style="color:#006080;">'Group By Schema_id;'</span><span style="color:#006080;">';</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec(@SQL);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">';</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image004.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image004" src="http://gerireshef.files.wordpress.com/2012/01/clip_image004_thumb.jpg?w=701&#038;h=199" alt="clip_image004" width="701" height="199" border="0" /></a></p>
<p>ולסיום נעטוף את כל זה ב-OpenRowSet תוך שמכפילים שוב את כל 'התגים':</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> <span style="color:#0000ff;">OpenRowset</span>(<span style="color:#006080;">'MSDASQL'</span>,<span style="color:#006080;">'DRIVER={SQL Server}; SERVER=localhost;trusted_connection=yes'</span>,<span style="color:#006080;">'Set FmtOnly Off </span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec SP_ExecuteSQL N'<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Declare @SQL Varchar(Max);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Select  @SQL=Isnull(@SQL+'<span style="color:#006080;">''</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+Char(9)+Char(9),'</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">')+'</span><span style="color:#006080;">''</span><span style="color:#006080;">'Count(Case When type_desc='</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">' Then 1 End) As ['</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">']'</span><span style="color:#006080;">''</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">From    sys.objects</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Group By type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Select  @SQL='<span style="color:#006080;">''</span><span style="color:#006080;">'Select Schema_id,'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">             Char(9)+Char(9)+@SQL+Char(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">             '<span style="color:#006080;">''</span><span style="color:#006080;">'From sys.objects'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">             '<span style="color:#006080;">''</span><span style="color:#006080;">'Group By Schema_id;'</span><span style="color:#006080;">''</span><span style="color:#006080;">';</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Exec(@SQL);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">';</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">');</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image006.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image006" src="http://gerireshef.files.wordpress.com/2012/01/clip_image006_thumb.jpg?w=702&#038;h=236" alt="clip_image006" width="702" height="236" border="0" /></a></p>
<p>קצת מורכב, אבל גם דינאמי וגם מאפשר לבצע פילטור, סינון, מיון, Join וכו'.</p>
<p>הקוד הנ&quot;ל נבדק בגרסאות 2005 ו-2008 ועבד ללא דופי. ב-2012 הוא נפל והופיעה הודעת שגיאה כדלקמן:</p>
<p dir="ltr"><span style="color:#ff0000;">Msg 11513, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1</span></p>
<p dir="ltr"><span style="color:#ff0000;">The metadata could not be determined because statement 'Exec SP_ExecuteSQL @SQL' contains dynamic SQL. Consider using the WITH RESULT SETS clause to explicitly describe the result set.</span></p>
<p><a href="http://gerireshef.wordpress.com/2010/12/01/with-result-sets-%d7%a4%d7%a8%d7%93%d7%99%d7%a7%d7%90%d7%98-%d7%97%d7%93%d7%a9-%d7%91-denali/">With Result Sets הוא אופרטור חדש בגרסת 2012</a> שנועד להגדיר במפורש ולעצב את סט התוצאות שפרוצדורה מחזירה.</p>
<p>השתמשתי בו כך (תוך שאני מגביל מראש את ערכי העמודות):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> <span style="color:#0000ff;">OPENROWSET</span> (<span style="color:#006080;">'SQLNCLI'</span>,<span style="color:#006080;">'Server=(Local);Trusted_Connection=Yes'</span>,<span style="color:#006080;">'Set FmtOnly Off</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec SP_ExecuteSQL N'<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Declare @SQL NVarchar(Max);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Select @SQL=Isnull(@SQL+'<span style="color:#006080;">''</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+Char(9)+Char(9),'</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">')+'</span><span style="color:#006080;">''</span><span style="color:#006080;">'Count(Case When type_desc='</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">' Then 1 End) As ['</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">']'</span><span style="color:#006080;">''</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">From   sys.objects</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Where  type_desc In ('<span style="color:#006080;">''</span><span style="color:#006080;">'System_Table'</span><span style="color:#006080;">''</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">'View'</span><span style="color:#006080;">''</span><span style="color:#006080;">')</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Group By type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Select @SQL='<span style="color:#006080;">''</span><span style="color:#006080;">'Select Schema_id,'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            Char(9)+Char(9)+@SQL+Char(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">            '<span style="color:#006080;">''</span><span style="color:#006080;">'From sys.objects'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">            '<span style="color:#006080;">''</span><span style="color:#006080;">'Group By Schema_id;'</span><span style="color:#006080;">''</span><span style="color:#006080;">';</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec   SP_ExecuteSQL @SQL</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">With Result Sets(([Schema_id] Int Not Null,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                  [System_Table] Int Not Null,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                  [View] Int Not Null));</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">';</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">');</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2012/01/clip_image008.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border:0;" title="clip_image008" src="http://gerireshef.files.wordpress.com/2012/01/clip_image008_thumb.jpg?w=701&#038;h=345" alt="clip_image008" width="701" height="345" border="0" /></a></p>
<p>כמובן שכאן הדרא קושיא לדוכתא וכעת עלינו להגדיר מראש ובמפורש את ה-Result Sets.</p>
<p>אני חושד שמיקרוסופט החליטו לסגור את הפרצות של OpenRowset שאיפשרו לנו להכשיר שרצים ולי לכתוב פוסטים..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1383&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2012/01/01/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image002_thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image004_thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image006_thumb.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2012/01/clip_image008_thumb.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>
	</item>
		<item>
		<title>FileTable ב-SQL Server 2012</title>
		<link>http://gerireshef.wordpress.com/2011/12/22/filetable-%d7%91-sql-server-2012/</link>
		<comments>http://gerireshef.wordpress.com/2011/12/22/filetable-%d7%91-sql-server-2012/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 18:54:18 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1370</guid>
		<description><![CDATA[הקדמה רקע קצרה: יתכן מצב בו נשקול אפשרות לשלב קבצים בבסיס הנתונים (הכוונה לקבצי טקסט, Office, גרפיקה, וידאו, קול וכו'; ולא לקבצי mdf..). תסריטים אפשריים: 1. למשאבי אנוש מגיעים קבצי קורות חיים של עובדים ורוצים לשמור אותם בבסיס הנתונים (במקום לאתר את המועמד בדטבייס ולחפש במיילים או במחיצות את קובץ ה-Word שהוא שלח). 2. עבדתי [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1370&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration:underline;">הקדמה רקע קצרה</span>: יתכן מצב בו נשקול אפשרות לשלב קבצים בבסיס הנתונים (הכוונה לקבצי טקסט, Office, גרפיקה, וידאו, קול וכו'; ולא לקבצי mdf..). תסריטים אפשריים:<br />
1. למשאבי אנוש מגיעים קבצי קורות חיים של עובדים ורוצים לשמור אותם בבסיס הנתונים (במקום לאתר את המועמד בדטבייס ולחפש במיילים או במחיצות את קובץ ה-Word שהוא שלח).<br />
2. עבדתי פעם בחברה שייצרה מוצר צריכה נפוץ, חנויות ששמו את המוצרים של החברה במקום בולט זכו לתגמול, וסוכני המכירות היו עורכים ביקורות – מצלמים ושומרים על קשר אישי. התמונות נשמרו במחיצה עם שם שכלל את מספר הלקוח, אבל היה נוח יותר לו ניתן לשלב את הקבצים או לפחות את מיקומם בבסיס הנתונים.<br />
3. הארגון רוצה לנהל מערכת מעקב אחר מסמכים המבוססת על SQL Server: אילו מסמכים יש, גרסאות, מאפיינים וכו'; שוב- מבלי שהקבצים יהיו קיימים באופן עצמאי ובלתי תלוי במערכת המידע.<br />
עד גרסת 2008 ניתן היה לשמור קבצים בטבלאות בעמודות BLOB כמתואר <a href="http://gerireshef.wordpress.com/2011/09/18/%d7%a9%d7%9e%d7%99%d7%a8%d7%aa-%d7%a7%d7%91%d7%a6%d7%99%d7%9d-%d7%91%d7%aa%d7%95%d7%9a-%d7%98%d7%91%d7%9c%d7%94/">בפוסט הזה</a>. הפתרון מאוד בעייתי משתי סיבות עיקריות:<br />
1. הדבר גורם לניפוח קבצי הדטבייס בקבצים ששמורים בהם כמידע בינארי, בשעה שאין למידע הזה שום שימוש כמידע לצורך פילטור או חישוב וכו' (אפשר כמובן לשמור בטבלה רק את מיקום הקובץ בדיסק אבל אז שתי המערכות אינן מסונכרנות בהכרח).<br />
2. הטיפול בקבצים מסורבל- במקום להיכנס עם ה-File Explorer למחיצה ושם לטפל בקבצים- יש לכתוב פרוצדורה שתשמור ותשלוף אותם על פי הצורך, וליצור ממשק משתמש משל עצמנו.<br />
מגרסת 2008 התווספה <a href="http://gerireshef.wordpress.com/2010/07/12/%d7%a9%d7%99%d7%9e%d7%95%d7%a9-%d7%91-file-stream/">אופציית ה-FileStream</a>: כעת יש אפשרות לשמור את הקבצים החיצוניים כך שאינם חלק מקבצי ה-mdf אלא נשמרים באופן עצמאי על הדיסק כ-FileStream, כלומר- כקובצים בינאריים שמערכת ה-SQL Server מתייחסת אליהם כאל אוסף של ביטים ובייטים מבלי להתעניין אם מדובר בקובץ PDF או Exe וכו'.<br />
זה פותר את בעייה מספר 1 הנ&quot;ל (ניפוח הקבצים), אך לא את מספר 2- עדיין יש לשמור ולשלוף בעזרת פקודות SQL, וזה אומר שצריך ליצור ממשק מתאים שיבצע את זה בכל פעם שנרצה לגשת לקבצים.<br />
החל מגרסת SQL Server 2012 גם בעייה מספר 2 באה על פתרונה: כעת ניתן לטפל בקבצים דרך סייר הקבצים (File Explorer) – להכניס, למחוק, לשנות, לפתוח, לשמור, ליצור מחיצות משנה, להעביר וכו'; וכל זה מעדכן אוטומטית את הטבלה הרלוונטית. באופן דומה ניתן בעזרת פעולות DML להעתיק ולהעביר קבצים, ליצור ולמחוק מחיצות, לעדכן מאפייני קבצים (Archive, Read Only..) וכו', וכל קובץ ותת-מחיצה מתחת למחיצה שהגדרנו לטבלה קיימים סינכרונית ב-File System ובטבלה עצמה.<br />
אם לדייק- נוכל לפגוש את הקבצים בצורה נוספת- יצירת הטבלה עם ה-FileStream יוצרת מחיצה במקום שהגדרנו שכוללת אובייקטים שונים של המערכת וקבצים בינאריים שמייצגים את הקבצים ששמרנו – ואיתם איננו אמורים להתעסק (כשם שאיננו מתעסקים ישירות עם קבצי ה-mdf אלא עם הטבלאות והפרוצדורות דרך ה-SSMS), אלא פונים למחיצה אחרת שכתובתה אינה c:\MyDir\.. כמקובל אלא משהו בסגנון של ..\MyServer\mssqlserver\MyFileTableDir\MyFileTableDirctory\\.</p>
<p><span style="text-decoration:underline;">דיבורים, דיבורים, אבל מה עם קצת קוד?</span><br />
קודם כל נקנפג את המערכת באופן חד פעמי לשימוש ב-FileStream:<br />
דרך התפריט ה-Programs:</p>
<p dir="ltr" align="left">=&gt; Microsoft SQL Server .. =&gt; Configuration Tools =&gt; פותחים את ה-SQL Server Configuration Manager.</p>
<p align="right">בצד שמאל של הכלי שנפתח בוחרים ב-SQL Server Services, ובצד ימין – קליק ימני על ה-Service הראשי של ה-Instance הרלוונטי (בדרך כלל – SQL Server (MSSQLSERVER)).<br />
בחלונית שנפתחת ניגשים ללשונית FileStream, מסמנים את ה-CheckBoxes הרלוונטיים, מאשרים וסוגרים.</p>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0024.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image002" src="http://gerireshef.files.wordpress.com/2011/12/clip_image002_thumb4.jpg?w=720&#038;h=330" alt="clip_image002" width="720" height="330" border="0" /></a></p>
<p>ב-SSMS יש לאפשר את השימוש בכלי כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span> SP_Configure Filestream_Access_Level, 2;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Reconfigure</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0043.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image004" src="http://gerireshef.files.wordpress.com/2011/12/clip_image004_thumb3.jpg?w=701&#038;h=118" alt="clip_image004" width="701" height="118" border="0" /></a></p>
<p>נעבור לדטבייס שנועד לבדיקות ונסיונות או ניצור אחד כזה על ידי פקודת Create Database MyDB (לא ניתן להשתמש ב-tempdb), ומכיוון שה-FileStream יוצר קבצים חדשים שהם חלק מהדטבייס – יש להגדיר FileGroup מתאים עבורם, מחיצה פיזית, ושם לוגי בו נפנה אליה:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Database</span> MyDB</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">      <span style="color:#0000ff;">Add</span> FileGroup MyFileTableFG <span style="color:#0000ff;">Contains</span> FileStream;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Database</span> MyDB</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">      <span style="color:#0000ff;">Add</span> <span style="color:#0000ff;">File</span>(Name=<span style="color:#006080;">'MyFileTableDirName'</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">      FileName=<span style="color:#006080;">'C:\MyFileTableFile'</span>)</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">      <span style="color:#0000ff;">To</span> FileGroup MyFileTableFG;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Alter</span> <span style="color:#0000ff;">Database</span> MyDB</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">      <span style="color:#0000ff;">Set</span> FileStream(Non_Transacted_Access=<span style="color:#0000ff;">Full</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">      Directory_Name=<span style="color:#006080;">'MyFileTableDir'</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p>ולבסוף ניצור טבלה שתהיה מסונכרנת עם המחיצה הנ&quot;ל (המחיצה הפיזית C:\MyFileTableFile המיוצגת לוגית על ידי MyFileTableDir):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Use</span> MyDB;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Create</span> <span style="color:#0000ff;">Table</span> MyTable <span style="color:#0000ff;">As</span> FileTable</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">       <span style="color:#0000ff;">With</span>(FileTable_Directory=<span style="color:#006080;">'MyFileTableDirectory'</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> MyTable <span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> name;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0062.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image006" src="http://gerireshef.files.wordpress.com/2011/12/clip_image006_thumb2.jpg?w=701&#038;h=492" alt="clip_image006" width="701" height="492" border="0" /></a></p>
<p>כעת עוד אין כלום במחיצה ולכן הטבלה ריקה, אבל כבר אפשר לשים לב שב-SSMS תחת מחיצת Tables מופיעה מחיצה חדשה בשם FileTables ובה הטבלה שנוצרה על פי הפקודה הנ&quot;ל למרות שלא ציינו את שמות העמודות (המבנה שלה קשיח- ולא ניתן לשנותו).</p>
<p>בתור התחלה נוסיף פנימה כמה קבצים.</p>
<p>נפתח את המחיצה הלוגית כך: קליק ימני על הטבלה, ובתפריט שנפתח לבחור ב-Explore File Table Directory, ונקבל את ה-File Explorer המוכר במחיצה</p>
<p dir="ltr" align="left">\\Gerireshef\mssqlserver\MyFileTableDir\MyFileTableDirectory</p>
<p>(המחשב שלי נקרא GeriReshef, ולכל אחד יופיע שם המחשב וה-Instance שלו).</p>
<p>ומי שמתעצל לחפש קבצים מתאימים אצלו במחשב יכול להוריד את <a href="https://docs.google.com/open?id=0B3oLQpQ-LDOVMzBlYTI1NjItYzhkZi00MmQyLWIwNDgtY2E0OTAwOGUyM2Q1">הקובץ המכווץ הזה</a>,</p>
<p>לפתוח אותו במחיצה שנפתחה,</p>
<p>ליצור בתוכה מחיצת משנה בשם Gibuy,</p>
<p>להעביר לשם את קובץ ה-Rar(כדאי כבר להתרגל לרפרש את התצוגה לאחר כל פעולה על ידי F5),</p>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0082.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image008" src="http://gerireshef.files.wordpress.com/2011/12/clip_image008_thumb2.jpg?w=701&#038;h=226" alt="clip_image008" width="701" height="226" border="0" /></a></p>
<p>ואפשר כך (למרות שלא ניתן &quot;להיכנס&quot; למחיצה על ידי פקודת CD):</p>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image009.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image009" src="http://gerireshef.files.wordpress.com/2011/12/clip_image009_thumb.png?w=681&#038;h=346" alt="clip_image009" width="681" height="346" border="0" /></a></p>
<p>וגם כך:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span> XP_CmdShell <span style="color:#006080;">'Dir \\Gerireshef\mssqlserver\MyFileTableDir\MyFileTableDirectory'</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image010.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image010" src="http://gerireshef.files.wordpress.com/2011/12/clip_image010_thumb.png?w=591&#038;h=369" alt="clip_image010" width="591" height="369" border="0" /></a></p>
<p>ולבדוק שוב את הטבלה:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> MyTable <span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> name;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image012.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image012" src="http://gerireshef.files.wordpress.com/2011/12/clip_image012_thumb.jpg?w=701&#038;h=185" alt="clip_image012" width="701" height="185" border="0" /></a></p>
<p>כבר אפשר לשים לב שהטבלה כוללת יחסי אב-בן (או- יחס של אחת לרבים 1:N עם עצמה), מה שמבטיח פוסט עתידי עם קוד רקורסיבי המאפשר לחקור את מבנה עץ מחיצות המשנה שמתחת למחיצה הלוגית.</p>
<p>סוג הנתון של העמודות האלו (path_locator, parent_path_locator) הוא Hierarchy_id וגם בזה עוד נלכלך את הידיים..</p>
<p>ננסה לבצע כמה פעולות עריכה באמצעות קוד, למשל אשכפל את עצמי (כלומר- את התמונה שלי):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">INSERT</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">INTO</span>   MyTable(file_stream,name)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> 0xFFD8FFE000104A46494600010100000100010000FFFE003B43524541544F523A2067642D6A7065672076312E3020287573696E6720494A47204A50454720763632292C207175616C697479203D2039300AFFDB0043000302020302020303030304030304050805050404050A070706080C0A0C0C0B0A0B0B0D0E12100D0E110E0B0B1016101113141515150C0F171816141812141514FFDB00430103040405040509050509140D0B0D1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414FFC00011080080008003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FD53A28A2800A28A64B22C68C58E001CD002492AC6096200F5358BAB6BD2DA42CF04624C0FBCC6AB6A9A979A7FD8ECB58D777FE646107CA3D8D71D5AEA3A23BA861255756469E25D5EE63258A423A8F2C5656A7AE6BB6EC64B7BF1B48CED9003834B338073E6E07B1AAE52DE42C59B25BAE6B8FEB677BCB13D8D0D2BE28DC0D9F6BB6F341E0F963041AEE342F14D8EBF1B1B698174E1E26E1D7EA2BCBE4B3B5914ED1961C8C1C52DB5ACD14916A16256D6E1728B2E72037707D8FA1AE9A58852382BE125455CF67A2B9EF097891F5CB3617110B7BC84ED96207233D8A9EE0D7435DCB53813B8514514C6145145002020D2D7243E287860939D5625C02DF3061C0FA8AB9A678F7C3FAC1896D358B2B86972111661B9B1D46DEB419FB48F737CB015CF789F565B745801F98F2DEC2B71AE2300FCC32066BC7FC59E24136A970C18905B007A01C57162EAFB281E960A8FB7AABB2342EB58DC1BE6FCAB267D50B861BB8FAD73773ABB84CA82D9358D77AB94720C873E95F372AB267DBD1A318AB2475171AC6D3B53F5AA936B063F98BFEB5CB9D4C49C8277D55BABB6900576C67B8ACB9FB1D0E36476F65ADACAC0E7F3AE8FC35A984B99E291BF77200483C8CFAD790A6AA90B91BC003BF6AD1D2BC53F65BC8DF7E50FCADCF1835D746AB83D4F2F1347DA41A3DB46A31E917705EA37C80849B1D0A138C9FA135E851C81D41041FA578658F88AD9A548DA71E4CDFBB60DD3918C56D6B9F19E0F01C1A7DBDF594D72194AB4D1B01F281C100F53ED5F4B4A7CE8F88AD1F652D4F5BC8A4DC3D6BE77BEFDA89EF04874BD276440FC925CC99623DD4743F8D735A8FED2DE24702DD2382396538531C583F8126B5EB639FDA7647D5A5C7A8A4F3573C1AF916EBE2EF8DAD2CD12C352326D70E44EAA64EBF7771072BEDFAD4B63F187E204D2CAEF790452615A34312F97C1C907D8F4C8E6993CF2FE53833E2474854DC39570BB8856CF35421F1D42D2B1667C93B5548CF3EA2B8CBCBDB716DE58489E427991739207626ACCB6804315E5AB23838C42C7E65FC7BD75FB28F53CFF006926B43D37E1F78AAEA4F19C2F24D731C660942A34BC0C2F5EBD2BB23AAB5E4624DDBCF73DCD78DF846FAE23D596692DF27694F309C1507AFD6BB5D43C65A4F84F4C6BBBF9846AA30BEE7D2BE6B354DCA3147DA64AD2A72933AE7BEC0C293C0E41AC8BDBE8E490860030AF9CFC69FB5F2C1BA3D2AC3CD9338CE3231EB9AC5F06FC7FBDF136AA915D2EC99DB0A91F53ED5E2384A2AECFAAA389849D91F49EA3AF41A73A23B2A9C7535CFDFF008CF4E3912DFA460762D8AF15F8CFE20D6EC74D334D6F35B46EB857E99F4AF9D1F52D6AEEE59E5BDB858CFCC7CC7C002B4A34FDA6A6789C43A5B23EFCD27C43A36AE0AC1A846E7B8DC3353DF39B101E37578CF46539AF883C3BA8DC59B89D7517B8847DE6B7712347F5507247E15EFDE01F144E444935CADF59CABC48A7907B715A4A9F23B1CB4B10E6BDE47AE26BB768D1A19F6EC75914B701B07A5751F159A5F16F81349BC899A396D6E406008C804720D7996B3A1788757B0F3AD560B4B75206F95B2C07AE0547A0F8EFFE10AD0AE6CFC437B0EB713B07548D48E5738E2BD3A38854229CD9E4E23052C555E4A68B300FECDB8F2BED2D287193BF19CFE153B9912313DDC2B213C2792A495FC2B9DB4F14587891DF55D274C3649F31F26562F82BD7683C8CFA55E1ADEF92DB559A596D51131E5A7AFAD7AF09AAB1538F53E5EB52961AA4A954DD13EA9E234D3D2311CA5640388D460FE22AC5AF982D56679A7922705FF74E735931680752B4BDD425786E06E3E54848563F5F435128B9D374E8A3FB4C3BE5C92B93938EDDF9ADB955B4673F334FDED8A77DA62DC05874FF00DFB83FBC3BC6569534236B61E748CECEA7E65C648FA0AA13FDA745BC4963729E672B22719F622B663D666B9B1DECBE64A770C2E7922BAA574ACB639E1C9ADD6A6BF83AD6E75AD9169EBFBDFBE32554ED1D8EEE2B1FE2769C97C862997CD7823632444F313FB8FE5505AEA0918FF4433D8DE32128C87A1FF0CF6AED346F0D43ACF95AADC5BACBA85CC020BE0BC19B6F2AD8E991CFE06BE6332938CD268FB2CA29A951E68BD7A9F1F6B5A06AB7B1EEB4D3E370C7E7F3C15C0F61DEB43C17E029748F14E8378D1FD94C9791A18E26279F55CF4F7AFAD356F0A5A46EA915887FE100C2C187D722B3869FA6DAEBBA4DBCF6E8822944A37004861DFDABCE7579972B47D1D2C3273BA63BF681F0C4D2F852D9E1B792E537A8923760DF29F6C7073DEBC2ED7E11A6A30C53C303077504C720E467AA95F5AFAC3C5DADD95F69F240E5195971B4D781EADAC6A1E109A09E746934E6728A779E076E7BF150A5C8BDC3BEB61936A48E7F4CF833636C58CF691876C80A9161B35DF7863E0F697A3C714B1C6D6D30C13863863EB8ADCF0C78EF47BF8A391214DCC01049CFEA6B5354D6A2B884BC2C158761D2B29D49496E60B0EA3AD8BA750FB1442DD8FC8CB8C939AF00BE98E93F116E349BCB7F3BCB6DE92E7E5646FF00EB1AF4ED53555BBB5421CABE79E7A55293408FC5D2C77ECE86E2CF28991F3B63F87FC2A5A72858BA2A3ED7531B4FB09B448A38AD5D9C2DCBB295EC3D7F2A351BD96498C724CF2C28DB9948008CF5C569EB56F25B9860855CCA07210E0826A8369329B420A0337DE28C73C7BFA57D8E5F1B508DF73F3ACEE5CD8D9B468DD6A3A74DA6491D92C96CAA4307773C93D415AC5B57686E2112CE63456F95A3E7F2CD319E2684979596404650F71DF9A6A3C24E70C6DF77EF3BE47F435E87223C2776F5362EEEF4FBC5512CAEAE877318C83C8A9FFB6AD2E08B769253E922E57F5AA4DA9DBCB74A8D6D1C91BFDE200045456F747CC7804293DBB642A91B768FC6A794ABEBA334AFB52DC63843046040DE79AEFACF501650C2CACA56440C1D4E41E3D6BCC351D18DBAC32DB3192393380149C7B035D678740D47E1FDD32CBFE95A6CE19477319FF0C9AF1734A5CF4D4D743EA322AFC95A54E5D568747AD78B258AD8E1F271DEBCB9B5BBE9AFAFF508E16BA68A12AB18FBC4F5E3F2AD4D46F7CE8865B04D6341AD45611B59E540724963FAD7CA45EB667DF7B5825B6A7976BFF1B358B881C496D3DA32E4149570411517847C57AFF89EDCC1AC5C23DA8F991003902ADF8D7C49E0913C915DEA6249C1C9FB38079F4358569F109637F2F46F0BDF5EC678570300FBE4D77C629AB24733555BE6BE87411CD27872FF0036B296B563CAE73B4D76961E2B7961E5C85F5AF258AEB5ABBBF49EE74F7D3AD5DBFD54926E653F85763B05BAA84F9D71D476AE69C6D2D0855A56699DF68F27DB9259431201CF1C8F4AD2D1BC71368A05B5DE8F21639F2EE62E55C6783EC47A1AE63C1D7A238DA3237863D8D745AC922DECE48FE5C9209F5E6BB70B4A3566A2CF27118B9E1A12A915765AD525BB9D06B31065757FBADC1C77CFAD650BBFB44924B346FB988FDFC1CED07B1A926D5259E39227B990C51FCD185EC7D0FA8ACF8EE1E25946F7532FDE58B1823D6BECA9A518F2A5B1F9FD6AD2AB2E77D4D0BAB2B7B7B22F6D75E63AB7CC5C72476E3D6A9D9BDDA891951E48946E6C2E315148F1C71A8521DC372F8C363FAD6A45A835DB44AB22A963CBAE40C7704568DD91968CA0B2A5B4910037CA7E632EC208F5153C7752EA1322B466F562C90817696FCAB66E2411A4CFA6B8B9B491B7B84C9963F500FA7E157A3F185A368F1C8E16D618CF94418C0738FE759B77D916A31BEACC3124F7F74AB6CCDA6A05E54B165571FA8FC6A16BC9ACDC49327911C8DF3C96E4AACBE871D01AB373A9E9F7324CE976D3ACEB811BAE173DB07B54BA7DD98B4836B20583712104C78F6C56528F32B4968694E6E9CB9A0F533E7BD47B868DB8461B90F515C62F8460F12F8924176EED6B082DB51CA86E7DABB47F0E5DCF6AEADB44F182F184F9832F19C1AC1D1AE05ADCC91EECC8DCE735F1789A2F0F59A89FA160713EDA946523175A8BC2BE14510C5E14B4B8B81FF2D7CBCB1FC6A858789EEB5790C71D8A59C00E02462BD76DB4FD1DED56E2E618A7B9C747E71EF591A86BBA65BCCD16C89180E022800FE353CF392D59EF4AB5D68CE2EFAD1EF2D4AEC0AD8CEEE98AE6ED2F24174B0C927319DA41E99AEAF52F105BE25F2C81E8B9AF2CBDD683EBD2C501046FF9B078FF003C52841EECF1F11595F43D474DBB6B19795059FF00D5ECC73EB5DFCA7CDF0DC323EC6DAF820F04FB7D6BC8B45BE69AF232C4617000CF15EC7A0C96274B986A09BED570C719CA93C6462BA284F96BC7B1C58AA77C2CDB3196481A659566785C10A62F2C302BDF9A76AD62219BCC8544B01195647048F5057A8AA129F99A4442916F215B7654FA7E94B246F0BA968DE32C3729E0F1F5AFB649EE7E77E43D9209D4BC20C4D8C3061C7E1E955A08D0BAA34A551CF0F8E17EB5A16D3A4F18B84B81F688F878987DF5FE869AC22F37CC31031B71B0B7233ED4D37D4761FA6DC1D0351636F89A19B0B967DB8079E9DEBA8FB6C6DADCD657F12792503C72280EBD3A11FE715CFE83636AB3C31DC7D9A5DFFF003D65F981EC40A357B8B8B1D4EE61568DC900C72A0C95F6CFF4AC5CAEF42D3E5572FC761A6349334691F94C4AC80F4145B45640083CC49E346CC7D0ECFA1AC359EE6F2D56302088B93E74BD09C1FE25C7EB58FAD78834DD154C561CDC63124AB900FD066949E86D0BC9EC761A5F89E1D3BE21DA689E62CCF762439072170B9AC5F1DF84DB4AD606B7A6004292D3DA632181EA57FA8AE07E1AF88964F8DDA534C438686450C79E4E2BE83D7ADD250CC4F415F23985471AE7DC65B454B0D63E76F1678E92D62496DE75C0009543D3D41AF34D43E223CF3EE556039F9B39AF57F88DE014904B35B471E252491B78CFF8D78CCFE0EBA8A428F1E307AD7346A41EA68E1553B363BFE130B9BF9B30B342718C91C11DF35774FB668A50554FCC72C7351E99E1D10CB993E5C7515DA595844D000A06F1C0C53954BAD074E836EEC9B42C42E011B875F7AF6DF87F335C936B1B0CCF1B20DF8C671C039AF1DB7B76B65070377AFAD7A2FC3FB92B22956F9D4E719AE6751D39292E87A12A6A7070665D978B7419F5BBDD16E6F1ECB57B494C3369F7AA6274907553DBE9F5ADABA6F32205234816021399327F2A6FED25F0F2CFC5DA25A78CB4F45B5F166948A1EE106DFB6403AC5263A903EEB751D3A572BE0DF1541AC69B15B5EB18E4007953673B7D8FA8FE55F6783C6AC4C2EF73E1730C03C2BBC766760F6B6BFBA5B9982C8D867206547B822949B7B1B856597CD841FE2EB514564BAA4CD6DE64915CA2E3247071EC7D7D6AB0373F2C0D1B18D5B612572A0D7A77B9E27374B172EAFC5AAACCD32E3AE5986722B96D7FE232998436CC669E43B5475C9AF39F12F8E6E2FD9B0C54740057117DACC88FBE394895790413906B8D451D0A958F6CBCD5E78E031C93E666E5C93CE7D2B95BB98BAB166C8E6BCD348F13CB7572DE7DC3B4C9F310EE4922BAD83C40974A470735475A1BA3EAA744F1CE95A8B9DA125DA5BD335F5ACBABC7A95924CAC36C8A08C73D6BE36F10DB33599997823E618EC6BD87E0E78F5BC43E198ADA5389EDFF0076C1B391FE22BE6F34C3B7FBC47D2E5988D1D2677BAF5A0BFB678F7631C865EA2BCBF59B1688C8643B9941C1C75AF52BDB775B3F386718CE6B93D6A349631BD4723A8AF0E0AC7D0495D5CF36874F79A5DECD91E98C56F58D905218707BE3BD3BC948A42A8A42F4E7B5680B71144369393ED5ACA5646718F2903179081BB8F5AEABC190CB6D741B9C66B374DD1CCADBF961DC0AEF740D2FCA19230B9CD66D7368CD1772D78FB504B7F08DDBBB8D9E51C835F2FE89ACBDA4F95C7964FF007BA0CD7A7FED05E37834DD3D74786606EA71F32FF757D4D7CFD1486ED4A094A9EA40AFA3CB68B841C9F53E6334ACA73505D0F7393E36DB5AC36D622D0DFDE261637818875F6C8E31F5AF40B0066B5919F7446E0070CAFF0037F857CE3E1C821D38011A856EE7D6BD0F47F175D5A7900137511611C916EE41FE120F635EDA938ABA3E6674EEEE8FFFD9,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">       <span style="color:#006080;">'MyJPG2.jpeg'</span>;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image013.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image013" src="http://gerireshef.files.wordpress.com/2011/12/clip_image013_thumb.png?w=668&#038;h=156" alt="clip_image013" width="668" height="156" border="0" /></a></p>
<p>קצת ארוך- זה ה-FileStream של התמונה שלי כפי שהעתקתי מעמודה file_stream מהטבלה, ולאחר ריפרוש F5 נראה את הקובץ במחיצה. אפשר לחסוך את זה על ידי Select מפולטר מהטבלה, אבל רציתי להמחיש שמעתה ניתן להעביר קבצים גם כך..</p>
<p>כעת ניצור מחיצה חדשה:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Insert</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Into</span>   MyTable(name,is_directory)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> <span style="color:#006080;">'MySubDir'</span>,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">       1;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image014.png"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image014" src="http://gerireshef.files.wordpress.com/2011/12/clip_image014_thumb.png?w=262&#038;h=152" alt="clip_image014" width="262" height="152" border="0" /></a></p>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image016.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image016" src="http://gerireshef.files.wordpress.com/2011/12/clip_image016_thumb.jpg?w=702&#038;h=254" alt="clip_image016" width="702" height="254" border="0" /></a></p>
<p>ונעביר אליה את הקובץ החדש שיצרנו על ידי Update למיקומו:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Update</span> MyTable</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Set</span>    path_locator=(<span style="color:#0000ff;">Select</span> path_locator.ToString() <span style="color:#0000ff;">From</span> MyTable <span style="color:#0000ff;">Where</span> name=<span style="color:#006080;">'MySubDir'</span>)+Stuff(path_locator.ToString(),1,1,<span style="color:#006080;">''</span>)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Where</span>  name=<span style="color:#006080;">'MyJPG2.jpeg'</span>;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image018.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image018" src="http://gerireshef.files.wordpress.com/2011/12/clip_image018_thumb.jpg?w=702&#038;h=116" alt="clip_image018" width="702" height="116" border="0" /></a></p>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image020.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image020" src="http://gerireshef.files.wordpress.com/2011/12/clip_image020_thumb.jpg?w=701&#038;h=136" alt="clip_image020" width="701" height="136" border="0" /></a></p>
<p>כאן צריך להתחיל לתרגל את ההיכרות עם ה-HierarchyID והפונקציות שלו (נדמה לי שאנשי הדוט-נט קוראים לזה מתודות..)- ToString או Cast As Varchar מציגה את הערכים כשרשור של העץ מהשורש עד אליהם:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span>  name,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">        path_locator.ToString() [path_locator],</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">        <span style="color:#0000ff;">Cast</span>(parent_path_locator <span style="color:#0000ff;">As</span> <span style="color:#0000ff;">Varchar</span>(<span style="color:#0000ff;">Max</span>)) [parent_path_locator]</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>    MyTable;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image022.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="clip_image022" src="http://gerireshef.files.wordpress.com/2011/12/clip_image022_thumb.jpg?w=701&#038;h=227" alt="clip_image022" width="701" height="227" border="0" /></a></p>
<p>השתמשתי פעם ב-ToString ופעם ב-Cast As Varchar לצורך ההמחשה.</p>
<p>אפשר לראות שה-path_locator של שני הקבצים במחיצות המשנה מורכב מזה של המחיצה ומזה שלו; וכך העברנו את הקובץ מהמחיצה הראשית למשנית על ידי בניית ה-path_locator שלו.</p>
<p>מחיקה של קובץ תתבצע על ידי פקודת Delete, אך מחיקת מחיצה יכולה להתבצע בפעולת Delete רק אם אין לה תוכן, אחרת- יש לבצע קודם Delete לתוכן (אנחנו &quot;מריחים&quot; רקורסיה במקרה שרוצים למחוק ענף שלם מהעץ).</p>
<p>אנחנו ננסה למחוק בדרך מתחכמת- מכיוון שמדובר בטבלה היא אמורה לאפשר טרנזקציות. למשל-</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Begin</span> <span style="color:#0000ff;">Tran</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Delete</span> <span style="color:#0000ff;">From</span> MyTable <span style="color:#0000ff;">Where</span> name=<span style="color:#006080;">'MyJPG.jpeg'</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--<span style="color:#0000ff;">RollBack</span>;</pre>
</div>
</div>
<p>(לא לבצע RollBack בשלב זה אלא רק בסוף)</p>
<p>ב-Query חדש שנפתח ננסה להריץ</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> MyTable;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p>והשאילתה תתקע בגלל נעילה על הטבלה.</p>
<p>נריץ עם Hint של NoLock</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> MyTable (NoLock);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Go</pre>
</div>
</div>
<p>ולא נראה את הקובץ בטבלה.</p>
<p>ניגש למחיצה הלוגית ב-File Explorer, נרפרש, והוא איננו. כלומר- הכלי מציג מידע UnCommited. ראו הוזהרתם!</p>
<p>הסקרנים מוזמנים לחטט מעט בקרביים של המערכת ולהיכנס למחיצה הפיזית C:\MyFileTableFile שיצרנו, לחטט בתתי המחיצות ולחפש היכן שמורים הקבצים ובאיזה אופן (בכניסה יש לקבל אישור חד פעמי מכיוון שמדובר במחיצת מערכת).</p>
<p>במקרה זה נמצא שני קבצי File Stream בגודל 5kb של שני קבצי ה-Jpeg. הווה אומר- הקובץ עדיין קיים..</p>
<p>לסיום- לא לשכוח לבצע Rollback.</p>
<p>גיבוי- בדקתי והגיבוי מתבצע גם על הקבצים. חשוב לשים לב לכך- מצד אחד יתרון בכך שתפסנו שתי ציפורים ביד אחת ולא צריך לסמוך על החבר'ה מה-System, אבל מצד שני קבצי הגיבוי עלולים להתנפח וכבר עדיף להפיל את התיק חזרה על ה-System..</p>
<p><span style="text-decoration:underline;">לסיכום:</span> מעניין, סוגר את הפינה של ממשק המשתמש שנותרה פתוחה עד כה, ויש עוד הרבה מה לבדוק ובעיקר לנסות- חמישה קבצים צנועים בגודלם אינם מערכת אמיתית של אלפי קבצים גדולים בעץ מסועף של מחיצות וריבוי משתמשים.</p>
<p>אני מקווה עוד לחזור ולהתמודד עם בעיות הרקורסיה שהכלי מציב בפנינו.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1370/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1370/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1370/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1370&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2011/12/22/filetable-%d7%91-sql-server-2012/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image002_thumb4.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image004_thumb3.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image006_thumb2.jpg" medium="image">
			<media:title type="html">clip_image006</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image008_thumb2.jpg" medium="image">
			<media:title type="html">clip_image008</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image009_thumb.png" medium="image">
			<media:title type="html">clip_image009</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image010_thumb.png" medium="image">
			<media:title type="html">clip_image010</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image012_thumb.jpg" medium="image">
			<media:title type="html">clip_image012</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image013_thumb.png" medium="image">
			<media:title type="html">clip_image013</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image014_thumb.png" medium="image">
			<media:title type="html">clip_image014</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image016_thumb.jpg" medium="image">
			<media:title type="html">clip_image016</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image018_thumb.jpg" medium="image">
			<media:title type="html">clip_image018</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image020_thumb.jpg" medium="image">
			<media:title type="html">clip_image020</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image022_thumb.jpg" medium="image">
			<media:title type="html">clip_image022</media:title>
		</media:content>
	</item>
		<item>
		<title>פתרון לבעיית ה-Pivot הדינאמי</title>
		<link>http://gerireshef.wordpress.com/2011/12/20/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99/</link>
		<comments>http://gerireshef.wordpress.com/2011/12/20/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 19:05:38 +0000</pubDate>
		<dc:creator>גרי רשף</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://gerireshef.wordpress.com/?p=1339</guid>
		<description><![CDATA[הביטוי ניצחון פירוס מתאר מצב בו מחיר פתרון הבעייה הוא כזה שכבר עדיף היה להמשיך לחיות בשלום ובחירוק שיניים עם הבעייה, מאשר בחירוף נפש עם פתרונה; ופתרון מעין זה אני מציג כאן לבעיית ה-Pivot הדינאמי. הקדמה קצרה- את הקריירה שלי במסדי נתונים התחלתי ב-Access, עוד בימי Windows 3.11 העליזים כשכל יישום נקנה בנפרד ולא כמו [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1339&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>הביטוי <a href="http://he.wikipedia.org/wiki/נצחון_פירוס">ניצחון פירוס</a> מתאר מצב בו מחיר פתרון הבעייה הוא כזה שכבר עדיף היה להמשיך לחיות בשלום ובחירוק שיניים עם הבעייה, מאשר בחירוף נפש עם פתרונה; ופתרון מעין זה אני מציג כאן לבעיית ה-Pivot הדינאמי.<br />
הקדמה קצרה- את הקריירה שלי במסדי נתונים התחלתי ב-Access, עוד בימי Windows 3.11 העליזים כשכל יישום נקנה בנפרד ולא כמו היום בחבילת Ofiice, והתפרס על פני יותר מעשרה דיסקטים &quot;3.5..<br />
בכל מה שקשור ל-SQL עבדתי כמקובל עם הממשק הגרפי הנוח שלו (הממשק הטקסטואלי בלתי שימושי לחלוטין), ונדהמתי לגלות שיש מפתחים שמסוגלים לכתוב משפטי SQL בעצמם.. חלפו שנים, התקדמתי ל-SQL Server, כיום גם אני כותב משפטי SQL עם יד אחת קשורה מאחורי הגב, אבל ליכולת אחת חשובה של אקסס טרם מצאתי תחליף- יכולות ה-Pivot שלה.<br />
עד גרסת 2005 לא הייתה אופציה כזו ב-SQL Server למרות שבאקסס זה התבצע ללא בעייה עוד מגרסאותיו הראשונות למעלה מעשר שנים לפני כן, ואב&quot;ג לימד אותנו איך לעשות זאת בעזרת SQL דינאמי.<br />
אופציית ה-Pivot שהתווספה בגרסת 2005 הייתה נחותה לעומת זאת של אקסס וחייבה לציין במפורש את שמות העמודות, למשל- שליפה המציגה שורה לכל סכימה (dbo, sys וכו'), עמודה לכל סוג אובייקט (טבלה, View, טריגר, אינדקס..), ובכל תא – כמה כאלו יש (למשל- כמה טבלאות בסכימת dbo וכו'):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--<span style="color:#0000ff;">If</span> Object_ID(<span style="color:#006080;">'Tmp'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>   *</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--<span style="color:#0000ff;">Into</span>   Tmp</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">From</span>     (<span style="color:#0000ff;">Select</span>  object_id,</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">                  type_desc,</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">                  Schema_Name(schema_id) [<span style="color:#0000ff;">Schema</span>]</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">         <span style="color:#0000ff;">From</span>     sys.objects) <span style="color:#0000ff;">As</span> p</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Pivot    (<span style="color:#0000ff;">Count</span> (object_id)</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">For</span>      type_desc <span style="color:#0000ff;">In</span> ([FOREIGN_KEY_CONSTRAINT],[INTERNAL_TABLE],[PRIMARY_KEY_CONSTRAINT],[SERVICE_QUEUE],[SQL_SCALAR_FUNCTION],[SQL_STORED_PROCEDURE],[SYSTEM_TABLE],[UNIQUE_CONSTRAINT],[USER_TABLE],[<span style="color:#0000ff;">VIEW</span>])) <span style="color:#0000ff;">As</span> pvt</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> [<span style="color:#0000ff;">Schema</span>];</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">--<span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">--<span style="color:#0000ff;">If</span> Object_ID(<span style="color:#006080;">'Tmp'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> Tmp;</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0023.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;margin:0;" title="clip_image002" src="http://gerireshef.files.wordpress.com/2011/12/clip_image002_thumb3.jpg?w=722&#038;h=242" alt="clip_image002" width="722" height="242" border="0" /></a></p>
<p>בדוגמה הזו יש כמה קטעים מוערים (Commented)- בהמשך נשפוך את הפלט לטבלה ונשלוף ממנה, אבל את הרעיון הכללי אפשר להבין גם בלי זה.</p>
<p>ניתן לראות שלאחר האופרטור Pivot יש למנות את סוגי ה-type_desc במפורש, וכשהם אינם ידועים מראש- זו בעייה. בגרסה האקססית של ה-Pivot אין צורך בכך, ואני משער שהפער בין היכולות קשור לכך שאקסס הוא כלי לא תקני לחלוטין מבחינת חומרות ה-Ansi, ואילו SQL Server הולך בדרך הישר מבחינת ההתמודדות עם שליפה שהמבנה שלה אינו ידוע, ולכן אנחנו נדרשים להצהיר על כך במפורש.</p>
<p>מה ניתן לעשות אם איננו יודעים מראש אילו סוגי אובייקטים יש בסביבה בה השליפה הנ&quot;ל תרוץ?</p>
<p>הפתרון הוא ליצור SQL דינאמי: נגדיר משתנה, נשרשר לתוכו את הערכים מעמודת type_desc, נוסיף לו את שאר חלקי השליפה שלפני ואחרי רשימת העמודות, ונפעיל בעזרת Exec:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Declare</span> @<span style="color:#0000ff;">SQL</span> <span style="color:#0000ff;">Varchar</span>(<span style="color:#0000ff;">Max</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Select</span>  @<span style="color:#0000ff;">SQL</span>=IsNull(@<span style="color:#0000ff;">SQL</span>+<span style="color:#006080;">','</span>,<span style="color:#006080;">''</span>)+<span style="color:#006080;">'['</span>+type_desc+<span style="color:#006080;">']'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">From</span>    (<span style="color:#0000ff;">Select</span> <span style="color:#0000ff;">Distinct</span> type_desc <span style="color:#0000ff;">From</span> sys.objects) T</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Order</span> <span style="color:#0000ff;">By</span> type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Print</span> @<span style="color:#0000ff;">SQL</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">If</span> Object_ID(<span style="color:#006080;">'Tmp'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Set</span>     @<span style="color:#0000ff;">SQL</span>=<span style="color:#006080;">'Select *'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#006080;">'Into Tmp'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#006080;">'From (Select object_id,'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#006080;">' type_desc,'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#006080;">' Schema_Name(schema_id) [Schema]'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#006080;">' From sys.objects) As p'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#006080;">'Pivot (Count (object_id) For type_desc In ('</span>+@<span style="color:#0000ff;">SQL</span>+<span style="color:#006080;">')) As pvt'</span>+<span style="color:#0000ff;">Char</span>(13)+</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#006080;">'Order By [Schema];'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Print</span> @<span style="color:#0000ff;">SQL</span>;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Exec</span>(@<span style="color:#0000ff;">SQL</span>);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">If</span> Object_ID(<span style="color:#006080;">'Tmp'</span>) <span style="color:#0000ff;">Is</span> <span style="color:#0000ff;">Not</span> <span style="color:#0000ff;">Null</span> <span style="color:#0000ff;">Drop</span> <span style="color:#0000ff;">Table</span> Tmp;</pre>
</div>
</div>
<p>(אינני מצרף צילום מסך אך הפלט אותו פלט כמו קודם)</p>
<p>מה הועילו חכמים בתקנתם? עד גרסת 2005 השתמשנו ב-SQL דינאמי מסוג אחד וכעת ב-SQL דינאמי אחר; נכון שהסינטקס כעת אולי מעט יותר נוח, אבל הבעייה אותה בעייה: אם העמודות ידועות מראש ניתן לכתוב SQL רגיל ואם לא- SQL דינאמי..</p>
<p>אין ברירה אלא לחזור ל-OpenRowset – כלי מוכר בבלוג הזה שבעזרתו אפשר לעשות כל מה שאסור, ובין היתר להריץ פרוצדורות ולקבל שליפה שמתנהגת כ-Select רגיל.</p>
<p>למי שזו לו פעם ראשונה- יש לאפשר באופן חד פעמי שימוש בפקודה הנ&quot;ל על ידי:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">SP_Configure <span style="color:#006080;">'Ad Hoc Distributed Queries'</span>,1;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Go</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;"><span style="color:#0000ff;">Reconfigure</span> <span style="color:#0000ff;">With</span> Override;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Go</pre>
</div>
</div>
<p>כעת כך יש &quot;לעטוף&quot; את הקוד הנ&quot;ל בפקודת Exec שתהפוך את כולו לפרוצדורה אחת, ולצורך כך (חוץ מאשר לפתוח ב-Exec ופותח שמאלי וגרש, ולסיים בגרש וסוגר ימני) – נצטרך להכפיל את כל הגרשים שבקוד הקיים, ונקבל את הדבר המשונה הבא שלמרבה הפלא עובד (שוב- אותו פלט כמו קודם):</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Exec</span>(<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Declare @SQL Varchar(Max);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Select  @SQL=IsNull(@SQL+'<span style="color:#006080;">','</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">')+'</span><span style="color:#006080;">'['</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">']'</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">From    (Select Distinct type_desc From sys.objects) T</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Order By type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Print   @SQL;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">If Object_ID('<span style="color:#006080;">'Tmp'</span><span style="color:#006080;">') Is Not Null Drop Table Tmp;</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Set     @SQL='<span style="color:#006080;">'Select *'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">'Into Tmp'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">'From (Select object_id,'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">' type_desc,'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">' Schema_Name(schema_id) [Schema]'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">' From sys.objects) As p'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">'Pivot (Count (object_id) For type_desc IN ('</span><span style="color:#006080;">'+@SQL+'</span><span style="color:#006080;">')) As pvt'</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">'Order By [Schema];'</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Print @SQL;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec(@SQL);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Select * From Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">If Object_ID('<span style="color:#006080;">'Tmp'</span><span style="color:#006080;">') Is Not Null Drop Table Tmp;</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">');</pre>
</div>
</div>
<p>ולבסוף ניצור פקודת OpenRowset, ומכיוון שגם היא &quot;עוטפת&quot; את הקוד הנ&quot;ל בגרשים – נצטרך שוב להכפיל את כל הגרשים שבנ&quot;ל, ונקבל בסה&quot;כ את הדבר הבא:</p>
<div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:97.5%;">
<div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;" dir="ltr">
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;"><span style="color:#0000ff;">Select</span> * <span style="color:#0000ff;">From</span> <span style="color:#0000ff;">OpenRowset</span>(<span style="color:#006080;">'MSDASQL'</span>,<span style="color:#006080;">'DRIVER={SQL Server}; SERVER=localhost;trusted_connection=yes'</span>,<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec('<span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Declare  @SQL Varchar(Max);</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Select   @SQL=IsNull(@SQL+'<span style="color:#006080;">''</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">','</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">''</span><span style="color:#006080;">')+'</span><span style="color:#006080;">''</span><span style="color:#006080;">'['</span><span style="color:#006080;">''</span><span style="color:#006080;">'+type_desc+'</span><span style="color:#006080;">''</span><span style="color:#006080;">']'</span><span style="color:#006080;">''</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">From     (Select Distinct type_desc From sys.objects) T</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Order By type_desc;</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Print    @SQL;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">If Object_ID('<span style="color:#006080;">''</span><span style="color:#006080;">'Tmp'</span><span style="color:#006080;">''</span><span style="color:#006080;">') Is Not Null Drop Table Tmp;</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Set      @SQL='<span style="color:#006080;">''</span><span style="color:#006080;">'Select *'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">'Into Tmp'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">'From (Select object_id,'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">' type_desc,'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">' Schema_Name(schema_id) [Schema]'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">' From sys.objects) As p'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">'Pivot (Count (object_id) For type_desc IN ('</span><span style="color:#006080;">''</span><span style="color:#006080;">'+@SQL+'</span><span style="color:#006080;">''</span><span style="color:#006080;">')) As pvt'</span><span style="color:#006080;">''</span><span style="color:#006080;">'+Char(13)+</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">'<span style="color:#006080;">''</span><span style="color:#006080;">'Order By [Schema];'</span><span style="color:#006080;">''</span><span style="color:#006080;">'</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Print    @SQL;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">Exec(@SQL);</pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">Select * From Tmp;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">If Object_ID('<span style="color:#006080;">''</span><span style="color:#006080;">'Tmp'</span><span style="color:#006080;">''</span><span style="color:#006080;">') Is Not Null Drop Table Tmp;</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:white;width:100%;">'<span style="color:#006080;">');</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;">');</pre>
</div>
</div>
<p><a href="http://gerireshef.files.wordpress.com/2011/12/clip_image0042.jpg"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="clip_image004" src="http://gerireshef.files.wordpress.com/2011/12/clip_image004_thumb2.jpg?w=722&#038;h=397" alt="clip_image004" width="722" height="397" border="0" /></a></p>
<p>פקודת Select? כן.</p>
<p>עובד? כן.</p>
<p>יש לציין את ערכי העמודות במפורש? לא.</p>
<p>אלגנטי? ממש לא..</p>
<p>יציב? גם לא: אצלי השליפה נכשלת מסיבות לא ברורות, למשל אם אני מבטל את שורת הרווח חסרת המשמעות שלאחר ה-Print הראשון, או את הסמיקולון שבסוף..</p>
<p>כנראה שזו דוגמה לניצחון פירוס (אם לקשר לרישא של הפוסט).</p>
<p>הערת השלמה לגבי היציבות- הצלחתי להפעיל את זה מול SQL 2008 ו- SQL 2005 אך לא מול SQL 2012.</p>
<p>התלבטתי אם לפרסם את הפוסט לאור זאת, והחלטתי שכן תוך שאני מציין בבירור שזו אינה מציאה גדולה..</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gerireshef.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gerireshef.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gerireshef.wordpress.com/1339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gerireshef.wordpress.com&amp;blog=10967787&amp;post=1339&amp;subd=gerireshef&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gerireshef.wordpress.com/2011/12/20/%d7%a4%d7%aa%d7%a8%d7%95%d7%9f-%d7%9c%d7%91%d7%a2%d7%99%d7%99%d7%aa-%d7%94-pivot-%d7%94%d7%93%d7%99%d7%a0%d7%90%d7%9e%d7%99/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<georss:point>31.046051 34.851612</georss:point>
		<geo:lat>31.046051</geo:lat>
		<geo:long>34.851612</geo:long>
		<media:content url="http://0.gravatar.com/avatar/24ad1e42efdecf31844d99809dc19a7b?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">gerireshef</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image002_thumb3.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://gerireshef.files.wordpress.com/2011/12/clip_image004_thumb2.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>
	</item>
	</channel>
</rss>
