淺談c#的三個高級參數ref out 和Params C#中is與as的區別分析 「登錄」與「登陸」有何區別 經典SQL語句大全(絕對的經典)

淺談c#的三個高級參數ref out 和Params

 

c#的三個高級參數ref out 和Params

前言:在咱們學習c#基礎的時候,咱們會學習到c#的三個高級的參數,分別是out .ref 和Params,在這裏咱們來分別的講解一下,在這裏的咱們先不作具體的解釋,我會經過幾個例子來作分別的解釋。html

一:out參數面試

 1.首先我先給你們一個題:咱們來寫一個方法,來求一個數組中的最大值,最小值,總和,平均值。代碼以下:sql

 int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 數據庫

 經過分析咱們會發現若是咱們寫一個方法的時候,當咱們須要返回值的時候,咱們只能返回一個值,這個時候咱們須要求最大值,最小值,總和和平均值。咱們該如何的寫呢??假如咱們沒有學習過out參數,這時候咱們能夠考慮返回一個數組,而且分別的假定數組中的元素的最大值,最小值,總和。(當總和求出來以後,平均值也就出來了)。詳細的代以下:express

複製代碼
複製代碼
            //咱們聲明一個長度爲4的數組,假設 res[0] 最大值  res[1]最小值  res[2]總和  res[3]平均值
            int[] res = new int[4];
            //假定數組中的第一個元素爲最大值
            res[0] = nums[0];//max
            //假定數組中的第二個元素爲最小值
            res[1] = nums[0];//min
            //假定數組中的第三個元素爲總和
            res[2] = 0;//sum 
複製代碼
複製代碼

注:num[0]:這只是咱們假定的值。c#

2.這時候咱們須要遍歷for循環,若是當前循環到的元素比個人最大值還要大,就把當前的元素賦值給個人最大值,若是當前循環到的元素比個人最小值還要小,就把當前的元素賦值給個人最小值,總和就是全部的元素相加,平均值爲總和/數組的長度。詳細的代碼以下:windows

複製代碼
複製代碼
            for (int i = 0; i < nums.Length; i++)
            {
                //若是當前循環到的元素比我假定的最大值還大 
                if (nums[i] > res[0])
                {
                    //將當前循環到的元素賦值給個人最大值
                    res[0] = nums[i];
                }
                //若是當前循環到的元素比個人最小值還要小
                if (nums[i] < res[1])
                {
                    //就把當前的元素賦值給個人最小值
                    res[1] = nums[i];
                }
                //總和
                res[2] += nums[i];
            }
複製代碼
複製代碼

3.這時候直接返回數組就好了,完整的代碼以下:
數組

複製代碼
複製代碼
 1         /// <summary>
 2         /// 計算一個數組的最大值、最小值、總和、平均值
 3       /// </summary>
 4         /// <param name="nums"></param>
 5         /// <returns></returns>
 6         public static int[] GetMaxMinSumAvg(int[] nums)
 7         {
 8             //咱們聲明一個長度爲4的數組,假設 res[0] 最大值  res[1]最小值  res[2]總和  res[3]平均值
 9             int[] res = new int[4];
10             //假定數組中的第一個元素爲最大值
11             res[0] = nums[0];//max
12             //假定數組中的第二個元素爲最小值
13             res[1] = nums[0];//min
14             //假定數組中的第三個元素爲總和
15             res[2] = 0;//sum
16             for (int i = 0; i < nums.Length; i++)
17             {
18                 //若是當前循環到的元素比我假定的最大值還大 
19                 if (nums[i] > res[0])
20                 {
21                     //將當前循環到的元素賦值給個人最大值
22                     res[0] = nums[i];
23                 }
24                 //若是當前循環到的元素比個人最小值還要小
25                 if (nums[i] < res[1])
26                 {
27                     //就把當前的元素賦值給個人最小值
28                     res[1] = nums[i];
29                 }
30                 //總和
31                 res[2] += nums[i];
32             }
33             //平均值
34             res[3] = res[2] / nums.Length;
35             return res;
36         }
複製代碼
複製代碼

4.接下來就是在Main方法的中調用,截圖以下:
安全

5.這時候咱們須要考慮一個問題,我想要在數組中返回bool類型的值或者返回string類型的值,這時候咱們怎麼辦呢??這時候須要咱們的out參數登場了,out參數就側重於在一個方法中返回多個不一樣類型的值,可是它有一個重要的特色是:必須在方法的內部爲其賦值。服務器

(1).在咱們須要返回的值的前面加out關鍵字。

(2).當咱們在Main方法中調用咱們的方法的時候,首先須要先聲明變量。

解題的思路跟上面的同樣這裏就不作過多的解釋了,直接完整的代碼奉上:

 

複製代碼
複製代碼
        /// <summary>
        /// 計算一個整數數組的最大值、最小值、平均值、總和
      /// </summary>
        /// <param name="nums">要求值得數組</param>
        /// <param name="max">多餘返回的最大值</param>
        /// <param name="min">多餘返回的最小值</param>
        /// <param name="sum">多餘返回的總和</param>
        /// <param name="avg">多餘返回的平均值</param>
        public static void Test(int[] nums, out int max, out int min, out int sum, out int avg)
        {
            //out參數要求在方法的內部必須爲其賦值   
            //咱們假設數組中的第一個元素爲最大值
            max = nums[0];
            //假設數組中的第一個元素爲最小值
            min = nums[0];
            //總和設置爲零
            sum = 0;
            for (int i = 0; i < nums.Length; i++)
            {
                if (nums[i] > max)
                {
                    max = nums[i];
                }
                if (nums[i] < min)
                {
                    min = nums[i];
                }
                sum += nums[i];
            }
            avg = sum / nums.Length;
        }
複製代碼
複製代碼

 

 

 

複製代碼
複製代碼
 1         static void Main(string[] args)
 2         {
 3             //寫一個方法 求一個數組中的最大值、最小值、總和、平均值
 4             int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 5             //變量的聲明
 6             int max1;
 7             int min1;
 8             int sum1;
 9             int avg1;
10             //方法的調用
11             Test(numbers, out max1, out min1, out sum1, out avg1);
12             Console.WriteLine(max1);
13             Console.WriteLine(min1);
14             Console.WriteLine(sum1);
15             Console.WriteLine(avg1);
16             Console.ReadKey();
17 
18         }
複製代碼
複製代碼

調試的結果以下:

6.如今我麼用out參數作一個練習:分別的提示用戶輸入用戶名和密碼,寫一個方法來判斷用戶輸入的是否正確,返回給用戶一個登陸的結果,而且還要單獨的返回給用戶一個登陸的信息,若是用戶名錯誤,除了返回登陸結果以外,還要返回一個「用戶名錯誤」,若是密碼錯誤,除了返回登陸結果以外,還要返回一個「密碼錯誤」。

分析的思路:經過上面的題咱們分析咱們不只要返回一個登陸結果,還要多餘的返回一個登陸的信息(是登陸名錯誤仍是密碼錯誤仍是未知的錯誤),這時候咱們須要考慮使用out參數了。完整的代碼以下:

複製代碼
複製代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _08使用out參數作登錄
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請輸入用戶名");
            string userName = Console.ReadLine();
            Console.WriteLine("請輸入密碼");
            string userPwd = Console.ReadLine();
            string msg;
            bool b = IsLogin(userName, userPwd, out msg);
            Console.WriteLine("登錄結果{0}",b);
            Console.WriteLine("登錄信息{0}",msg);
            Console.ReadKey();
        }

        /// <summary>
        /// 判斷登錄是否成功
        /// </summary>
        /// <param name="name">用戶名</param>
        /// <param name="pwd">密碼</param>
        /// <param name="msg">多餘返回的登錄信息</param>
        /// <returns>返回登錄結果</returns>
        public static bool IsLogin(string name, string pwd, out string msg)
        {
            if (name == "admin" && pwd == "888888")
            {
                msg = "登錄成功";
                return true;
            }
            else if (name == "admin")
            {
                msg = "密碼錯誤";
                return false;
            }
            else if (pwd == "888888")
            {
                msg = "用戶名錯誤";
                return false;
            }
            else
            {
                msg = "未知錯誤";
                return false;
            }
        }
    }
}
複製代碼
複製代碼

結果以下截圖:

 

 二:那麼接下來講一下ref參數的使用。

那麼老規矩咱們首先來看一下這道題:使用方法來交換兩個int類型的變量。

思路分析:首先這個一道很是經典的面試題,咱們可使用兩種方法來作這道題(這裏不詳細的解釋)。

首先聲明一個方法來實現兩個int類型變量的交換。代碼以下:

複製代碼
複製代碼
 1         /// <summary>
 2         /// 交換兩個int類型的變量
 3       /// </summary>
 4         /// <param name="n1">第一個參數</param>
 5         /// <param name="n2">第二個參數</param>
 6         public static void Test(int n1, int n2)
 7         {
 8             n1 = n1 - n2;//-10 20
 9             n2 = n1 + n2;//-10 10
10             n1 = n2 - n1;//20 10
11         }
複製代碼
複製代碼

在這個時候考慮咱們在Main方法中調用就能實現結果嗎??答案是不行的。這就設計到咱們的值類型和引用類型(在後面作詳細的解釋)。這個時候咱們就要用到咱們的ref參數了。這個時候咱們給ref參數作一個定義:ref參數能夠將一個變量帶入到一個方法中進行改變,改變完成後,在將改變完成後的值帶出方法。特色:ref參數要求在方法的外部必須爲其賦值,在方法的內部能夠不賦值。

完整的代碼以下:

複製代碼
複製代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _11_ref練習
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用方法來交換兩個int類型的變量
          //必須在方法的外部爲其賦值
          int n1 = 10;
            int n2 = 20;
            Test(ref n1, ref n2);
            Console.WriteLine(n1);
            Console.WriteLine(n2);
            Console.ReadKey();
        }

        /// <summary>
        /// 交換兩個int類型的變量
        /// </summary>
        /// <param name="n1">第一個參數</param>
        /// <param name="n2">第二個參數</param>
        public static void Test(ref int n1, ref int n2)
        {
            //方法的內部能夠不賦值
            n1 = n1 - n2;//-10 20
            n2 = n1 + n2;//-10 10
            n1 = n2 - n1;//20 10
        }
    }
}
複製代碼
複製代碼

代碼的結果截圖以下:

 三:下面咱們來介紹一下Params可變參數。

此次咱們的題目是:求任意長度的數字的和(整數類型的)。

咱們直接給出定義:將實參列表跟可變參數類型一致的元素都看成數組中的元素來處理。特色:Params可變參數必須是形參列表中的最後一個元素。

直接看代碼:

 

複製代碼
複製代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _12params可變參數
{
    class Program
    {
        static void Main(string[] args)
        {
            int sum = GetSum(8,9);
            Console.WriteLine(sum);
            Console.ReadKey();
        }

        /// <summary>
        /// 求數組中的和
        /// </summary>
        /// <param name="n">數組</param>
        /// <returns>返回總和</returns>
        public static int GetSum(params int[] n)
        {
            int sum = 0;
            for (int i = 0; i < n.Length; i++)
            {
                sum += n[i];
            }
            return sum;
        }
    }
}
複製代碼
複製代碼

你們看見了嗎,這時候咱們將8 ,9 就看成咱們形參列表數組中的元素來進行處理,這樣的話咱們就是實現了咱們的功能了。

 四:這個時候咱們該討論一下out參數和ref參數爲何能夠實現這樣的功能。好比拿ref參數作例子:

 在討論這個問題以前咱們該說一下值類型和引用類型的區別了。

(1):值類型和引用類型在內存中存儲的地方不同。

(2):在傳遞值類型和傳遞引用類型的時候,傳遞的方式不同,值類型咱們稱之爲值傳遞,引用類型咱們稱之爲引用傳遞。

值類型    :int double bool char decimal struct enum

引用類型:string 自定義類 數組 object 集合 接口

在舉例子以前首先請容許我說兩個重要的概念:

(1):值類型在複製的時候,傳遞的是這個值的自己。

(2):引用類型在複製的時候,傳遞的是對這個對象的引用。

首先咱們先來句第一個例子,代碼以下:

複製代碼
複製代碼
 //值傳遞和引用傳遞
int n1 = 10;
int n2 = n1;
n2 = 20;
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.ReadKey();
複製代碼
複製代碼

你們猜一下結果是多少??答案是:10 20,由於int是值類型,當我聲明int n1=10,就至關於咱們在內存的棧中開闢了一塊內存地址,那咱們如何在咱們的內存中找到咱們的值呢(也就是咱們給這塊內存區域取一個名字,也就是咱們的變量名),ok,當執行int n2=n1的時候,也就是進行了一個賦值的操做,如上所說,值類型在傳遞的時候咱們傳遞的是值的自己。因此當咱們執行完第二行的代碼的時候,n2=10,當執行完第三行的代碼的時候,又從新給n2賦值n2=20,全部輸出的結果就是:n1=10,n2=20。 畫圖表示以下:

接下來咱們看第二個例子(Person默認是自定義類):

1 Person p1 = new Person();
2 p1.Name = "張三";
3 Person p2 = p1;
4 p2.Name = "李四";
5 Console.WriteLine(p1.Name);
6 Console.ReadKey();

這個時候p1.Name爲多少呢?? 答案是:李四。首先咱們確定是Person是自定義類,由於咱們的自定義類爲引用類型,因此在進行引用傳遞的時候傳遞的是對這個對象的引用(內存地址)。當咱們聲明第一行的代碼的時候,會在內存的堆中開闢一塊區域存儲new Person();當爲其Name賦值的時候,張三也存儲在堆中,這時候也會在棧中開闢一塊空間存儲了指向這塊區域的地址。因此當執行Person p2=p1,是把P1在棧中的引用複製了一份給了P2,因此如今他們兩指向的是堆中同一塊區域。因此當給Name從新賦值的時候,p1的值也會改變。截圖以下:

畫圖表示以下:

 

 第三個例子:,代碼以下:

1 string s1 = "張三";
2 string s2 = s1;
3 s2 = "李四";
4 Console.WriteLine(s1);
5 Console.WriteLine(s2);
6 Console.ReadKey();

這個時候咱們的s1和s2是多少呢??通過個人測試答案是:s1:張三,s2:李四。爲何呢?要是按照咱們上面的過程應該都是李四呀?由於咱們的字符串是很是特殊的,正是因爲字符串的不可變性,沒每當咱們在爲其賦值的時候都會在堆中從新開闢一塊區域進行存儲。因此兩塊區域沒有任何的關係。

思考的問題:這時候咱們回顧在一個方法中實現交換變量的例子,當咱們沒有用ref的時候,傳遞的是值的自己,當咱們使用ref參數的時候傳遞的是這個對象的引用(內存地址)。因此咱們總結出來ref的做用是:ref參數能夠將一個值傳遞改變爲引用傳遞。

好的,咱們c#中的三個高級參數在這裏就介紹完了,若是你們有什麼疑問的話,能夠留言,你們共同進步。

原文地址:http://www.cnblogs.com/MoRanQianXiao/p/7702587.html。 

 

 
 

C#中is與as的區別分析

 

這篇文章主要介紹了C#中is與as的區別,較爲詳細的分析了is與as的原理與特性及用法區別,具備很好的學習借鑑價值,須要的朋友能夠參考下

本文實例分析了C#中is與as的區別,分享給你們供你們參考。具體分析以下:

1、C#類型的轉換

在c#中類型的轉換分兩種:顯式和隱式,基本的規則以下:

一、基類對象轉化爲子類對象,必須顯式轉換,規則:(類型名) 對象。
二、值類型和引用類型的轉換採用裝箱(boxing)或拆箱(unboxing).
三、子類轉化爲基類對象。
四、基本類型互相之間轉化能夠用Covent類來實現。
五、字符串類型轉換爲對應的基本類型用Parse方法,除了String類型外其餘的類型均可以用Parse方法。
六、用GetType能夠取得對象的精確類型。
七、子類轉化爲基類,採用隱式轉換。

2、C#中的is

檢查一個對象是否兼容於其餘指定的類型,並返回一個Bool值,若是一個對象是某個類型或是其父類型的話就返回爲true,不然的話就會返回爲false。永遠不會拋出異常
若是對象引用爲null,那麼is操做符老是返回爲false,由於沒有對象能夠檢查其類型。

例如 

  代碼以下:

  object o = new object();
  if (o is Label)
  {
      Label lb = (Label)o;
      Response.Write("類型轉換成功");
  }
  else
  {
      Response.Write("類型轉換失敗");   
  }

 

3、C#中as的轉換規則

一、檢查對象類型的兼容性,並返回轉換結果,若是不兼容則返回null;
二、不會拋出異常;
三、若是結果判斷爲空,則強制執行類型轉換將拋出NullReferenceException異常;
四、用as來進行類型轉換的時候,所要轉換的對象類型必須是目標類型或者轉換目標類型的派生類型

例如 

  代碼以下:
  object o = new object();    
  Label lb = o as Label;    
  if (lb == null)
  {
      Response.Write("類型轉換失敗");
  }
  else
  {      
      Response.Write("類型轉換成功"); 
  }

 

使用as操做符有以下幾點限制

第一個就是,不用在類型之間進行類型轉化,即以下編寫就會出現編譯錯誤。

 

  代碼以下:
  NewType newValue = new NewType();
  NewType1 newValue = newValue as NewType1;

 

第二個就是,不能應用在值類型數據,即不能以下寫(也會出現編譯錯誤)。

 

  代碼以下:
  object objTest = 11;
  int nValue = objTest as int;

 

4、as與is的區別

一、AS在轉換的同事兼判斷兼容性,若是沒法進行轉換,則 as 返回 null(沒有產生新的對象)而不是引起異常。有了AS我想之後就不要再用try-catch來作類型轉換的判斷了。所以as轉換成功要判斷是否爲null。

二、AS是引用類型類型的轉換或者裝箱轉換,不能用與值類型的轉換。若是是值類型只能結合is來強制轉換
三、IS只是作類型兼容判斷,並不執行真正的類型轉換。返回true或false,不會返回null,對象爲null也會返回false。

四、AS模式的效率要比IS模式的高,由於藉助IS進行類型轉換的化,須要執行兩次類型兼容檢查。而AS只須要作一次類型兼容,一次null檢查,null檢查要比類型兼容檢查快。

5、在進行類型轉換的時候,能夠按照以下的方式進行選擇

一、Object => 已知引用類型
使用as操做符來完成

二、Object => 已知值類型
先使用is操做符來進行判斷,再用類型強轉方式進行轉換

三、已知引用類型之間轉換
首先須要相應類型提供轉換函數,再用類型強轉方式進行轉換

四、已知值類型之間轉換
最好使用系統提供的Convert類所涉及的靜態方法

6、(int)和Int32.Parse(),Convert.ToInt32()三者的區別

一、(int)轉換:用在數值範圍大的類型轉換成數值範圍小的類型時使用,可是若是被轉換的數值大於或者小於數值範圍,則獲得一個錯誤的結果,利用這種轉換方式不能將string轉換成int,會報錯。

二、Int32.Parse()轉換:在符合數字格式的string到int類型轉換過程當中使用,並能夠對錯誤的string數字格式的拋出相應的異常。

三、Convert.ToInt32()轉換:使用這種轉換,所提供的字符串必須是數值的有效表達方式,該數還必須不是溢出的數。不然拋出異常。

但願本文所述對你們的C#程序設計有所幫助。

轉載自:http://www.jb51.net/article/56657.htm。

 
 
 
 
 
 
 
 
 

「登錄」與「登陸」有何區別

 
做者:Gauin李紅濤
連接:https://www.zhihu.com/question/19570377/answer/15706722
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

辭海釋意

一、登錄,渡過海洋或江河登上陸地。特指做戰的軍隊由水面登上敵方的陸地。Land之意,後來引伸爲着陸之意。
之前說上網,是網上衝浪。早期是網頁時代,只須要點擊連接看頁面上的內容便可。那時候尚未註冊會員。因此,這個時期的網上衝浪,即爲登錄網站,到達了網站。不用進行輸入註冊帳號和密碼等操做便可瀏覽公開的網頁信息。

二、登陸,列入;記載。登記記錄用戶輸入的註冊帳號和密碼。
技術層面上解釋更準確,即用戶輸入註冊帳號和密碼的時候,數據進行記錄覈對的過程,錄入成功後,則登陸成功。登陸,則存在表層和底層的信息登記和記錄覈對的過程。登陸成功後,纔算正在進入網站能夠查看登錄時看不到的內容。

即,網上衝浪登錄到了網站,不登陸網站也能夠看到一些信息。登陸成功後,則能夠進入帳戶中心等須要通行證才能看到的信息。

早期錯誤的論證

寫這篇博文以前,我搜索了下看是否有人已經很清楚的說明了兩者之間的區別。雖然大部分同窗已經認同了使用登陸是正確的,但我仍是看到了一篇07年5月1日發表在新浪的文章—「登錄網站」仍是「登陸網站」  。

此文對登錄、登陸詞義的解釋都是正確的。但卻忽視了一個重要的使用場景問題。即登錄在網頁時代流行網上衝浪,登錄到某個網站,即達到某個網站查看信息。但後期網站開放了會員註冊,有些信息須要登陸成功後纔可見。而登陸,正是登記記錄用戶輸入的會員註冊帳號和密碼的過程。

中文Top10網站統計

百度 —登陸
騰訊網 —一鍵登陸
淘寶 —登陸
新浪 —登陸
網易 —登陸
搜搜 —登陸
搜狐 —登陸
hao123  —登陸
優酷  —登陸
鳳凰網 —登陸
排名統計出處 
看上面的統計結果,中文前10名網站使用都是正確的哦。贊一個。因此,錯誤使用登陸一詞的產品同窗該打屁股啦。

原文出處:  《Web產品基礎模塊設計規範》第一章 註冊登陸  第一節 登陸與登錄 
 
 
 
 
 

經典SQL語句大全(絕對的經典)

 

 
  1. 經典SQL語句大全(絕對的經典)  
  2.   
  3.   
  4. 1、基礎   

 

 
  1. 一、說明:建立數據庫  
  2. CREATE DATABASE database-name   
  3. 二、說明:刪除數據庫  
  4. drop database dbname  
  5. 三、說明:備份sql server  
  6. --- 建立 備份數據的 device  
  7. USE master  
  8. EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'  
  9. --- 開始 備份  
  10. BACKUP DATABASE pubs TO testBack   
  11. 四、說明:建立新表  
  12. create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)  
  13.   
  14. 根據已有的表建立新表:   
  15. A:create table tab_new like tab_old (使用舊錶建立新表)  
  16. B:create table tab_new as select col1,col2… from tab_old definition only  
  17. 五、說明:刪除新表  
  18. drop table tabname   
  19. 六、說明:增長一個列  
  20. Alter table tabname add column col type  
  21. 注:列增長後將不能刪除。DB2中列加上後數據類型也不能改變,惟一能改變的是增長varchar類型的長度。  
  22. 七、說明:添加主鍵: Alter table tabname add primary key(col)   
  23. 說明:刪除主鍵: Alter table tabname drop primary key(col)   
  24. 八、說明:建立索引:create [unique] index idxname on tabname(col….)   
  25. 刪除索引:drop index idxname  
  26. 注:索引是不可更改的,想更改必須刪除從新建。  
  27. 九、說明:建立視圖:create view viewname as select statement   
  28. 刪除視圖:drop view viewname  
  29. 十、說明:幾個簡單的基本的sql語句  
  30. 選擇:select * from table1 where 範圍  
  31. 插入:insert into table1(field1,field2) values(value1,value2)  
  32. 刪除:delete from table1 where 範圍  
  33. 更新:update table1 set field1=value1 where 範圍  
  34. 查找:select * from table1 where field1 like ’%value1%’ ---like的語法很精妙,查資料!  
  35. 排序:select * from table1 order by field1,field2 [desc]  
  36. 總數:select count as totalcount from table1  
  37. 求和:select sum(field1) as sumvalue from table1  
  38. 平均:select avg(field1) as avgvalue from table1  
  39. 最大:select max(field1) as maxvalue from table1  
  40. 最小:select min(field1) as minvalue from table1  
  41. 十一、說明:幾個高級查詢運算詞  
  42. A: UNION 運算符   
  43. UNION 運算符經過組合其餘兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。當 ALL 隨 UNION一塊兒使用時(即 UNION ALL),不消除重複行。兩種狀況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。   
  44. B: EXCEPT 運算符   
  45. EXCEPT 運算符經過包括全部在 TABLE1 中但不在 TABLE2 中的行並消除全部重複行而派生出一個結果表。當 ALL 隨 EXCEPT 一塊兒使用時 (EXCEPT ALL),不消除重複行。   
  46. C: INTERSECT 運算符  
  47. INTERSECT 運算符經過只包括 TABLE1 和 TABLE2 中都有的行並消除全部重複行而派生出一個結果表。當 ALL 隨 INTERSECT 一塊兒使用時 (INTERSECT ALL),不消除重複行。   
  48. 注:使用運算詞的幾個查詢結果行必須是一致的。   
  49. 十二、說明:使用外鏈接   
  50. A、left (outer) join:   
  51. 左外鏈接(左鏈接):結果集幾包括鏈接表的匹配行,也包括左鏈接表的全部行。   
  52. SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  53. B:right (outer) join:   
  54. 右外鏈接(右鏈接):結果集既包括鏈接表的匹配鏈接行,也包括右鏈接表的全部行。   
  55. C:full/cross (outer) join:   
  56. 全外鏈接:不只包括符號鏈接表的匹配行,還包括兩個鏈接表中的全部記錄。  
  57. 十二、分組:Group by:  
  58.   一張表,一旦分組 完成後,查詢後只能獲得組相關的信息。  
  59. 組相關的信息:(統計信息) count,sum,max,min,avg 分組的標準)  
  60.  在SQLServer中分組時:不能以text,ntext,image類型的字段做爲分組依據  
  61. 在selecte統計函數中的字段,不能和普通的字段放在一塊兒;  
  62.   
  63. 1三、對數據庫進行操做:  
  64. 分離數據庫: sp_detach_db; 附加數據庫:sp_attach_db 後接代表,附加須要完整的路徑名  
  65. 14.如何修改數據庫的名稱:  
  66. sp_renamedb 'old_name', 'new_name'  
  67.   
  68.   
  69.   
  70. 2、提高  
  71.   
  72. 一、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)  
  73. 法一:select * into b from a where 1<>1(僅用於SQlServer)  
  74. 法二:select top 0 * into b from a  
  75. 二、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)  
  76. insert into b(a, b, c) select d,e,f from b;  
  77.   
  78. 三、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)  
  79. insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件  
  80. 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..  
  81.   
  82. 四、說明:子查詢(表名1:a 表名2:b)  
  83. select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)  
  84.   
  85. 五、說明:顯示文章、提交人和最後回覆時間  
  86. select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  
  87.   
  88. 六、說明:外鏈接查詢(表名1:a 表名2:b)  
  89. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
  90.   
  91. 七、說明:在線視圖查詢(表名1:a )  
  92. select * from (SELECT a,b,c FROM a) T where t.a > 1;  
  93.   
  94. 八、說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括  
  95. select * from table1 where time between time1 and time2  
  96. select a,b,c, from table1 where a not between 數值1 and 數值2  
  97.   
  98. 九、說明:in 的使用方法  
  99. select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)  
  100.   
  101. 十、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息   
  102. delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )  
  103.   
  104. 十一、說明:四表聯查問題:  
  105. select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....  
  106.   
  107. 十二、說明:日程安排提早五分鐘提醒   
  108. SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5  
  109.   
  110. 1三、說明:一條sql 語句搞定數據庫分頁  
  111. select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段  
  112. 具體實現:  
  113. 關於數據庫分頁:  
  114.   
  115. declare @start int,@end int  
  116.   
  117.  @sql nvarchar(600)  
  118.   
  119.  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’  
  120.   
  121. exec sp_executesql @sql  
  122.   
  123.   
  124. 注意:在top後不能直接跟一個變量,因此在實際應用中只有這樣的進行特殊的處理。Rid爲一個標識列,若是top後還有具體的字段,這樣作是很是有好處的。由於這樣能夠避免 top的字段若是是邏輯索引的,查詢的結果後實際表中的不一致(邏輯索引中的數據有可能和數據表中的不一致,而查詢時若是處在索引則首先查詢索引)  
  125.   
  126. 1四、說明:前10條記錄  
  127. select top 10 * form table1 where 範圍  
  128.   
  129. 1五、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的全部信息(相似這樣的用法能夠用於論壇每個月排行榜,每個月熱銷產品分析,按科目成績排名,等等.)  
  130. select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)  
  131.   
  132. 1六、說明:包括全部在 TableA 中但不在 TableB和TableC 中的行並消除全部重複行而派生出一個結果表  
  133. (select a from tableA ) except (select a from tableB) except (select a from tableC)  
  134.   
  135. 1七、說明:隨機取出10條數據  
  136. select top 10 * from tablename order by newid()  
  137.   
  138. 1八、說明:隨機選擇記錄  
  139. select newid()  
  140.   
  141. 1九、說明:刪除重複記錄  
  142. 1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)  
  143. 2),select distinct * into temp from tablename  
  144.  delete from tablename  
  145.  insert into tablename select * from temp  
  146. 評價: 這種操做牽連大量的數據的移動,這種作法不適合大容量但數據操做  
  147. 3),例如:在一個外部表中導入數據,因爲某些緣由第一次只導入了一部分,但很難判斷具體位置,這樣只有在下一次所有導入,這樣也就產生好多重複的字段,怎樣刪除重複字段  
  148.   
  149. alter table tablename  
  150. --添加一個自增列  
  151. add column_b int identity(1,1)  
  152.  delete from tablename where column_b not in(  
  153. select max(column_b) from tablename group by column1,column2,...)  
  154. alter table tablename drop column column_b  
  155.   
  156. 20、說明:列出數據庫裏全部的表名  
  157. select name from sysobjects where type='U' // U表明用戶  
  158.   
  159. 2一、說明:列出表裏的全部的列名  
  160. select name from syscolumns where id=object_id('TableName')  
  161.   
  162. 2二、說明:列示type、vender、pcs字段,以type字段排列,case能夠方便地實現多重選擇,相似select 中的case。  
  163. select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  
  164. 顯示結果:  
  165. type vender pcs  
  166. 電腦 A 1  
  167. 電腦 A 1  
  168. 光盤 B 2  
  169. 光盤 A 2  
  170. 手機 B 3  
  171. 手機 C 3  
  172.   
  173. 2三、說明:初始化表table1  
  174.   
  175. TRUNCATE TABLE table1  
  176.   
  177. 2四、說明:選擇從10到15的記錄  
  178. select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc  
  179.   
  180. 3、技巧  
  181.   
  182. 一、1=1,1=2的使用,在SQL語句組合時用的較多  
  183.   
  184. where 1=1」 是表示選擇所有    「where 1=2」所有不選,  
  185. 如:  
  186. if @strWhere !=''   
  187. begin  
  188. set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere   
  189. end  
  190. else   
  191. begin  
  192. set @strSQL = 'select count(*) as Total from [' + @tblName + ']'   
  193. end  
  194.   
  195. 咱們能夠直接寫成  
  196.   
  197. 錯誤!未找到目錄項。  
  198. set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 二、收縮數據庫  
  199. --重建索引  
  200. DBCC REINDEX  
  201. DBCC INDEXDEFRAG  
  202. --收縮數據和日誌  
  203. DBCC SHRINKDB  
  204. DBCC SHRINKFILE  
  205.   
  206. 三、壓縮數據庫  
  207. dbcc shrinkdatabase(dbname)  
  208.   
  209. 四、轉移數據庫給新用戶以已存在用戶權限  
  210. exec sp_change_users_login 'update_one','newname','oldname'  
  211. go  
  212.   
  213. 五、檢查備份集  
  214. RESTORE VERIFYONLY from disk='E:\dvbbs.bak'  
  215.   
  216. 六、修復數據庫  
  217. ALTER DATABASE [dvbbs] SET SINGLE_USER  
  218. GO  
  219. DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK  
  220. GO  
  221. ALTER DATABASE [dvbbs] SET MULTI_USER  
  222. GO  
  223.   
  224. 七、日誌清除  
  225. SET NOCOUNT ON  
  226. DECLARE @LogicalFileName sysname,  
  227.  @MaxMinutes INT,  
  228.  @NewSize INT  
  229.   
  230.   
  231. USE tablename -- 要操做的數據庫名  
  232. SELECT  @LogicalFileName = 'tablename_log', -- 日誌文件名  
  233. @MaxMinutes = 10, -- Limit on time allowed to wrap log.  
  234.  @NewSize = 1  -- 你想設定的日誌文件的大小(M)  
  235.   
  236. Setup / initialize  
  237. DECLARE @OriginalSize int  
  238. SELECT @OriginalSize = size   
  239.  FROM sysfiles  
  240.  WHERE name = @LogicalFileName  
  241. SELECT 'Original Size of ' + db_name() + ' LOG is ' +   
  242.  CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +   
  243.  CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'  
  244.  FROM sysfiles  
  245.  WHERE name = @LogicalFileName  
  246. CREATE TABLE DummyTrans  
  247.  (DummyColumn char (8000) not null)  
  248.   
  249.   
  250. DECLARE @Counter    INT,  
  251.  @StartTime DATETIME,  
  252.  @TruncLog   VARCHAR(255)  
  253. SELECT @StartTime = GETDATE(),  
  254.  @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'  
  255.   
  256. DBCC SHRINKFILE (@LogicalFileName, @NewSize)  
  257. EXEC (@TruncLog)  
  258. -- Wrap the log if necessary.  
  259. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired  
  260.  AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)    
  261.  AND (@OriginalSize * 8 /1024) > @NewSize    
  262.  BEGIN -- Outer loop.  
  263. SELECT @Counter = 0  
  264.  WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))  
  265.  BEGIN -- update  
  266.  INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans  
  267.  SELECT @Counter = @Counter + 1  
  268.  END  
  269.  EXEC (@TruncLog)    
  270.  END  
  271. SELECT 'Final Size of ' + db_name() + ' LOG is ' +  
  272.  CONVERT(VARCHAR(30),size) + ' 8K pages or ' +   
  273.  CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'  
  274.  FROM sysfiles   
  275.  WHERE name = @LogicalFileName  
  276. DROP TABLE DummyTrans  
  277. SET NOCOUNT OFF  
  278.   
  279. 八、說明:更改某個表  
  280. exec sp_changeobjectowner 'tablename','dbo'  
  281.   
  282. 九、存儲更改所有表  
  283.   
  284. CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch  
  285. @OldOwner as NVARCHAR(128),  
  286. @NewOwner as NVARCHAR(128)  
  287. AS  
  288.   
  289. DECLARE @Name    as NVARCHAR(128)  
  290. DECLARE @Owner   as NVARCHAR(128)  
  291. DECLARE @OwnerName   as NVARCHAR(128)  
  292.   
  293. DECLARE curObject CURSOR FOR   
  294. select 'Name'    = name,  
  295.    'Owner'    = user_name(uid)  
  296. from sysobjects  
  297. where user_name(uid)=@OldOwner  
  298. order by name  
  299.   
  300. OPEN   curObject  
  301. FETCH NEXT FROM curObject INTO @Name, @Owner  
  302. WHILE(@@FETCH_STATUS=0)  
  303. BEGIN       
  304. if @Owner=@OldOwner   
  305. begin  
  306.    set @OwnerName = @OldOwner + '.' + rtrim(@Name)  
  307.    exec sp_changeobjectowner @OwnerName, @NewOwner  
  308. end  
  309. -- select @name,@NewOwner,@OldOwner  
  310.   
  311. FETCH NEXT FROM curObject INTO @Name, @Owner  
  312. END  
  313.   
  314. close curObject  
  315. deallocate curObject  
  316. GO  
  317.   
  318.   
  319. 十、SQL SERVER中直接循環寫入數據  
  320. declare @i int  
  321. set @i=1  
  322. while @i<30  
  323. begin  
  324.   insert into test (userid) values(@i)  
  325.   set @i=@i+1  
  326. end  
  327. 案例:  
  328. 有以下表,要求就裱中全部沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:  
  329.   
  330. Name score  
  331.   
  332. Zhangshan 80  
  333.   
  334. Lishi  59  
  335.   
  336. Wangwu  50  
  337.   
  338. Songquan 69  
  339.   
  340. while((select min(score) from tb_table)<60)  
  341.   
  342. begin  
  343.   
  344. update tb_table set score =score*1.01  
  345.   
  346. where score<60  
  347.   
  348. if (select min(score) from tb_table)>60  
  349.   
  350.  break  
  351.   
  352.  else  
  353.   
  354.  continue  
  355.   
  356. end  
  357.   
  358.   
  359.   
  360. 數據開發-經典  
  361.   
  362.   
  363. 1.按姓氏筆畫排序:  
  364. Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //從少到多  
  365.   
  366. 2.數據庫加密:  
  367. select encrypt('原始密碼')  
  368. select pwdencrypt('原始密碼')  
  369. select pwdcompare('原始密碼','加密後密碼') = 1--相同;不然不相同 encrypt('原始密碼')  
  370. select pwdencrypt('原始密碼')  
  371. select pwdcompare('原始密碼','加密後密碼') = 1--相同;不然不相同  
  372.   
  373. 3.取回表中字段:  
  374. declare @list varchar(1000),  
  375. @sql nvarchar(1000)   
  376. select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'  
  377. set @sql='select '+right(@list,len(@list)-1)+' from 表A'   
  378. exec (@sql)  
  379.   
  380. 4.查看硬盤分區:  
  381. EXEC master..xp_fixeddrives  
  382.   
  383. 5.比較A,B表是否相等:  
  384. if (select checksum_agg(binary_checksum(*)) from A)  
  385.      =  
  386.     (select checksum_agg(binary_checksum(*)) from B)  
  387. print '相等'  
  388. else  
  389. print '不相等'  
  390.   
  391. 6.殺掉全部的事件探察器進程:  
  392. DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses  
  393. WHERE program_name IN('SQL profiler',N'SQL 事件探查器')  
  394. EXEC sp_msforeach_worker '?'  
  395.   
  396. 7.記錄搜索:  
  397. 開頭到N條記錄  
  398. Select Top N * From 表  
  399. -------------------------------  
  400. N到M條記錄(要有主索引ID)  
  401. Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc  
  402. ----------------------------------  
  403. N到結尾記錄  
  404. Select Top N * From 表 Order by ID Desc  
  405. 案例  
  406. 例如1:一張表有一萬多條記錄,表的第一個字段 RecID 是自增加字段, 寫一個SQL語句, 找出表的第31到第40個記錄。  
  407.   
  408. select top 10 recid from A where recid not in(select top 30 recid from A)  
  409.   
  410. 分析:若是這樣寫會產生某些問題,若是recid在表中存在邏輯索引。  
  411.   
  412. select top 10 recid from A where……是從索引中查找,然後面的select top 30 recid from A則在數據表中查找,這樣因爲索引中的順序有可能和數據表中的不一致,這樣就致使查詢到的不是原本的欲獲得的數據。  
  413.   
  414. 解決方案  
  415.   
  416. 1, 用order by select top 30 recid from A order by ricid 若是該字段不是自增加,就會出現問題  
  417.   
  418. 2, 在那個子查詢中也加條件:select top 30 recid from A where recid>-1  
  419.   
  420. 例2:查詢表中的最後以條記錄,並不知道這個表共有多少數據,以及表結構。  
  421. set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from  T)'  
  422.   
  423. print @s exec sp_executesql @s  
  424.   
  425. 9:獲取當前數據庫中的全部用戶表  
  426. select Name from sysobjects where xtype='u' and status>=0  
  427.   
  428. 10:獲取某一個表的全部字段  
  429. select name from syscolumns where id=object_id('表名')  
  430.   
  431. select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')  
  432.   
  433. 兩種方式的效果相同  
  434.   
  435. 11:查看與某一個表相關的視圖、存儲過程、函數  
  436. select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'  
  437.   
  438. 12:查看當前數據庫中全部存儲過程  
  439. select name as 存儲過程名稱 from sysobjects where xtype='P'  
  440.   
  441. 13:查詢用戶建立的全部數據庫  
  442. select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')  
  443. 或者  
  444. select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01  
  445.   
  446. 14:查詢某一個表的字段和數據類型  
  447. select column_name,data_type from information_schema.columns  
  448. where table_name = '表名'  
  449.   
  450. 15:不一樣服務器數據庫之間的數據操做  
  451.   
  452. --建立連接服務器  
  453.   
  454. exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '遠程服務器名或ip地址 '  
  455.   
  456. exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用戶名 ', '密碼 '  
  457.   
  458. --查詢示例  
  459.   
  460. select * from ITSV.數據庫名.dbo.表名  
  461.   
  462. --導入示例  
  463.   
  464. select * into 表 from ITSV.數據庫名.dbo.表名  
  465.   
  466. --之後再也不使用時刪除連接服務器  
  467.   
  468. exec sp_dropserver 'ITSV ', 'droplogins '  
  469.   
  470.   
  471.   
  472. --鏈接遠程/局域網數據(openrowset/openquery/opendatasource)  
  473.   
  474. --一、openrowset  
  475.   
  476. --查詢示例  
  477.   
  478. select * from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)  
  479.   
  480. --生成本地表  
  481.   
  482. select * into 表 from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)  
  483.   
  484.   
  485.   
  486. --把本地表導入遠程表  
  487.   
  488. insert openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)  
  489.   
  490. select *from 本地表  
  491.   
  492. --更新本地表  
  493.   
  494. update b  
  495.   
  496. set b.列A=a.列A  
  497.   
  498.  from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)as a inner join 本地表 b  
  499.   
  500. on a.column1=b.column1  
  501.   
  502. --openquery用法須要建立一個鏈接  
  503.   
  504. --首先建立一個鏈接建立連接服務器  
  505.   
  506. exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '遠程服務器名或ip地址 '  
  507.   
  508. --查詢  
  509.   
  510. select *  
  511.   
  512. FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ')  
  513.   
  514. --把本地表導入遠程表  
  515.   
  516. insert openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ')  
  517.   
  518. select * from 本地表  
  519.   
  520. --更新本地表  
  521.   
  522. update b  
  523.   
  524. set b.列B=a.列B  
  525.   
  526. FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名 ') as a   
  527.   
  528. inner join 本地表 b on a.列A=b.列A  
  529.   
  530.   
  531.   
  532. --三、opendatasource/openrowset  
  533.   
  534. SELECT *  
  535.   
  536. FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登錄名;Password=密碼 ' ).test.dbo.roy_ta  
  537.   
  538. --把本地表導入遠程表  
  539.   
  540. insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登錄名;Password=密碼 ').數據庫.dbo.表名  
  541.   
  542. select * from 本地表   
  543.   
  544. SQL Server基本函數  
  545.   
  546. SQL Server基本函數  
  547.   
  548. 1.字符串函數 長度與分析用  
  549.   
  550. 1,datalength(Char_expr) 返回字符串包含字符數,但不包含後面的空格  
  551. 2,substring(expression,start,length) 取子串,字符串的下標是從「1」,start爲起始位置,length爲字符串長度,實際應用中以len(expression)取得其長度  
  552. 3,right(char_expr,int_expr) 返回字符串右邊第int_expr個字符,還用left於之相反  
  553. 4,isnull( check_expression , replacement_value )若是check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操做類  
  554.   
  555. 5,Sp_addtype 自定義數據類型  
  556. 例如:EXEC sp_addtype birthday, datetime, 'NULL'  
  557. 6,set nocount {on|off}  
  558. 使返回的結果中不包含有關受 Transact-SQL 語句影響的行數的信息。若是存儲過程當中包含的一些語句並不返回許多實際的數據,則該設置因爲大量減小了網絡流量,所以可顯著提升性能。SET NOCOUNT 設置是在執行或運行時設置,而不是在分析時設置。  
  559. SET NOCOUNT 爲 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。  
  560.   
  561. SET NOCOUNT 爲 OFF 時,返回計數  
  562. 常識  
  563.    
  564. 在SQL查詢中:from後最多能夠跟多少張表或視圖:256  
  565. 在SQL語句中出現 Order by,查詢時,先排序,後取  
  566. 在SQL中,一個字段的最大容量是8000,而對於nvarchar(4000),因爲nvarchar是Unicode碼。   
  567.    
  568. SQLServer2000同步複製技術實現步驟  
  569. 1、 預備工做  
  570. 1.發佈服務器,訂閱服務器都建立一個同名的windows用戶,並設置相同的密碼,作爲發佈快照文件夾的有效訪問用戶  
  571. --管理工具  
  572. --計算機管理  
  573. --用戶和組  
  574. --右鍵用戶  
  575. --新建用戶  
  576. --創建一個隸屬於administrator組的登錄windows的用戶(SynUser)  
  577. 2.在發佈服務器上,新建一個共享目錄,作爲發佈的快照文件的存放目錄,操做:  
  578. 個人電腦--D:\ 新建一個目錄,名爲: PUB  
  579. --右鍵這個新建的目錄  
  580. --屬性--共享  
  581. --選擇"共享該文件夾"  
  582. --經過"權限"按紐來設置具體的用戶權限,保證第一步中建立的用戶(SynUser) 具備對該文件夾的全部權限  
  583.    
  584. --肯定  
  585. 3.設置SQL代理(SQLSERVERAGENT)服務的啓動用戶(發佈/訂閱服務器均作此設置)  
  586. 開始--程序--管理工具--服務  
  587. --右鍵SQLSERVERAGENT  
  588. --屬性--登錄--選擇"此帳戶"  
  589. --輸入或者選擇第一步中建立的windows登陸用戶名(SynUser)  
  590. --"密碼"中輸入該用戶的密碼  
  591. 4.設置SQL Server身份驗證模式,解決鏈接時的權限問題(發佈/訂閱服務器均作此設置)  
  592. 企業管理器  
  593. --右鍵SQL實例--屬性  
  594. --安全性--身份驗證  
  595. --選擇"SQL Server 和 Windows"  
  596. --肯定  
  597. 5.在發佈服務器和訂閱服務器上互相註冊  
  598. 企業管理器  
  599. --右鍵SQL Server組  
  600. --新建SQL Server註冊...  
  601. --下一步--可用的服務器中,輸入你要註冊的遠程服務器名 --添加  
  602. --下一步--鏈接使用,選擇第二個"SQL Server身份驗證"  
  603. --下一步--輸入用戶名和密碼(SynUser)  
  604. --下一步--選擇SQL Server組,也能夠建立一個新組  
  605. --下一步--完成  
  606. 6.對於只能用IP,不能用計算機名的,爲其註冊服務器別名(此步在實施中沒用到)  
  607.  (在鏈接端配置,好比,在訂閱服務器上配置的話,服務器名稱中輸入的是發佈服務器的IP)  
  608. 開始--程序--Microsoft SQL Server--客戶端網絡實用工具  
  609. --別名--添加  
  610. --網絡庫選擇"tcp/ip"--服務器別名輸入SQL服務器名  
  611. --鏈接參數--服務器名稱中輸入SQL服務器ip地址  
  612. --若是你修改了SQL的端口,取消選擇"動態決定端口",並輸入對應的端口號  
  613. 2、 正式配置  
  614. 一、配置發佈服務器  
  615. 打開企業管理器,在發佈服務器(B、C、D)上執行如下步驟:  
  616. (1) 從[工具]下拉菜單的[複製]子菜單中選擇[配置發佈、訂閱服務器和分發]出現配置發佈和分發嚮導   
  617. (2) [下一步] 選擇分發服務器 能夠選擇把發佈服務器本身做爲分發服務器或者其餘sql的服務器(選擇本身)  
  618. (3) [下一步] 設置快照文件夾  
  619. 採用默認\\servername\Pub  
  620. (4) [下一步] 自定義配置   
  621. 能夠選擇:是,讓我設置分發數據庫屬性啓用發佈服務器或設置發佈設置  
  622. 否,使用下列默認設置(推薦)  
  623. (5) [下一步] 設置分發數據庫名稱和位置 採用默認值  
  624. (6) [下一步] 啓用發佈服務器 選擇做爲發佈的服務器  
  625. (7) [下一步] 選擇須要發佈的數據庫和發佈類型  
  626. (8) [下一步] 選擇註冊訂閱服務器  
  627. (9) [下一步] 完成配置  
  628. 二、建立出版物  
  629. 發佈服務器B、C、D上  
  630. (1)從[工具]菜單的[複製]子菜單中選擇[建立和管理髮布]命令  
  631. (2)選擇要建立出版物的數據庫,而後單擊[建立發佈]  
  632. (3)在[建立發佈嚮導]的提示對話框中單擊[下一步]系統就會彈出一個對話框。對話框上的內容是複製的三個類型。咱們如今選第一個也就是默認的快照發布(其餘兩個你們能夠去看看幫助)  
  633. (4)單擊[下一步]系統要求指定能夠訂閱該發佈的數據庫服務器類型,  
  634. SQLSERVER容許在不一樣的數據庫如 orACLE或ACCESS之間進行數據複製。  
  635. 可是在這裏咱們選擇運行"SQL SERVER 2000"的數據庫服務器  
  636. (5)單擊[下一步]系統就彈出一個定義文章的對話框也就是選擇要出版的表  
  637. 注意: 若是前面選擇了事務發佈 則再這一步中只能選擇帶有主鍵的表  
  638. (6)選擇發佈名稱和描述  
  639. (7)自定義發佈屬性 嚮導提供的選擇:  
  640. 是 我將自定義數據篩選,啓用匿名訂閱和或其餘自定義屬性  
  641. 否 根據指定方式建立發佈 (建議採用自定義的方式)  
  642. (8)[下一步] 選擇篩選發佈的方式   
  643. (9)[下一步] 能夠選擇是否容許匿名訂閱  
  644. 1)若是選擇署名訂閱,則須要在發佈服務器上添加訂閱服務器  
  645. 方法: [工具]->[複製]->[配置發佈、訂閱服務器和分發的屬性]->[訂閱服務器] 中添加  
  646. 不然在訂閱服務器上請求訂閱時會出現的提示:改發佈不容許匿名訂閱  
  647. 若是仍然須要匿名訂閱則用如下解決辦法   
  648. [企業管理器]->[複製]->[發佈內容]->[屬性]->[訂閱選項] 選擇容許匿名請求訂閱  
  649. 2)若是選擇匿名訂閱,則配置訂閱服務器時不會出現以上提示  
  650. (10)[下一步] 設置快照 代理程序調度  
  651. (11)[下一步] 完成配置  
  652. 當完成出版物的建立後建立出版物的數據庫也就變成了一個共享數據庫  
  653. 有數據   
  654. srv1.庫名..author有字段:id,name,phone,   
  655. srv2.庫名..author有字段:id,name,telphone,adress   
  656.    
  657. 要求:   
  658. srv1.庫名..author增長記錄則srv1.庫名..author記錄增長   
  659. srv1.庫名..author的phone字段更新,則srv1.庫名..author對應字段telphone更新   
  660. --*/   
  661.    
  662. --大體的處理步驟   
  663. --1.在 srv1 上建立鏈接服務器,以便在 srv1 中操做 srv2,實現同步   
  664. exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql實例名或ip'   
  665. exec sp_addlinkedsrvlogin 'srv2','false',null,'用戶名','密碼'   
  666. go  
  667. --2.在 srv1 和 srv2 這兩臺電腦中,啓動 msdtc(分佈式事務處理服務),而且設置爲自動啓動  
  668. 。個人電腦--控制面板--管理工具--服務--右鍵 Distributed Transaction Coordinator--屬性--啓動--並將啓動類型設置爲自動啓動   
  669. go   
  670.    
  671.    
  672. --而後建立一個做業定時調用上面的同步處理存儲過程就好了   
  673.    
  674. 企業管理器   
  675. --管理   
  676. --SQL Server代理   
  677. --右鍵做業   
  678. --新建做業   
  679. --"常規"項中輸入做業名稱   
  680. --"步驟"項   
  681. --新建   
  682. --"步驟名"中輸入步驟名   
  683. --"類型"中選擇"Transact-SQL 腳本(TSQL)"   
  684. --"數據庫"選擇執行命令的數據庫   
  685. --"命令"中輸入要執行的語句: exec p_process   
  686. --肯定   
  687. --"調度"項   
  688. --新建調度   
  689. --"名稱"中輸入調度名稱   
  690. --"調度類型"中選擇你的做業執行安排   
  691. --若是選擇"反覆出現"   
  692. --點"更改"來設置你的時間安排   
  693.    
  694.    
  695. 而後將SQL Agent服務啓動,並設置爲自動啓動,不然你的做業不會被執行   
  696.    
  697. 設置方法:   
  698. 個人電腦--控制面板--管理工具--服務--右鍵 SQLSERVERAGENT--屬性--啓動類型--選擇"自動啓動"--肯定.   
  699.    
  700.    
  701. --3.實現同步處理的方法2,定時同步   
  702.    
  703. --在srv1中建立以下的同步處理存儲過程   
  704. create proc p_process   
  705. as   
  706. --更新修改過的數據   
  707. update b set name=i.name,telphone=i.telphone   
  708. from srv2.庫名.dbo.author b,author i   
  709. where b.id=i.id and  
  710. (b.name <> i.name or b.telphone <> i.telphone)   
  711.    
  712. --插入新增的數據   
  713. insert srv2.庫名.dbo.author(id,name,telphone)   
  714. select id,name,telphone from author i   
  715. where not exists(   
  716. select * from srv2.庫名.dbo.author where id=i.id)   
  717.    
  718. --刪除已經刪除的數據(若是須要的話)   
  719. delete b   
  720. from srv2.庫名.dbo.author b   
  721. where not exists(   
  722. select * from author where id=b.id)  
  723. go  

轉自:https://blog.csdn.net/u011863767/article/details/52764948。

相關文章
相關標籤/搜索