sqlserver關於查詢,存儲等方法記錄

暫時先做個記錄,以後再將各個部分完善起來

目錄

1.sqlserver中一種查父節點id的方法。

2.sqlserver合併多條數據

3.第一條語句是等同於in的方法,主要是因爲在C#中用@countryCode傳輸值得時候,將'hk','pk'的數值當做了字符串來處理,

4.排序中爲null的

5.查詢數據庫中的所有索引

6.創建遊標

7.查全部的存儲和視圖過程

8.創建一個存儲過程 

10新增字段和註釋


1.sqlserver中一種查父節點id的方法。

    方法不難,其實就是 遞歸調出所有的父節點,但是把不懂這個原理怎麼實現的,看着臨時表mt可以用在union all 裏本身還是有點懵的,暫時先記錄一下這個方法

 with mt as
		  (select t.ST_ID , t.ST_Name , t.ST_PID 
		  from AWeb_SupplyType t where ST_ID =10051
		 union all
		  select t.ST_ID , t.ST_Name , t.ST_PID  from AWeb_SupplyType t , mt 
		  where t.ST_ID = mt.ST_PID )
		 select ST_ID , ST_Name , ST_PID from mt where ST_PID=0

2.sqlserver合併多條數據

       FOR XML PATH   具體來講是將查詢結果集以XML形式

      基本用法是輸出時行節點可由row變爲MyHobby ,列名由字段名變爲別名

      SELECT CountryCode as 'Code', ContientType as 'Type' FROM PR_ServerCountry FOR XML PATH ('MyHobby')

    將其用於表中,可將xml的格式轉換爲列表格式path(")就是講行節點row置爲''

    select stuff((select ','+CountryCode from PR_ServerCountry for xml path('')),1,1,'') as name

3.第一條語句是等同於in的方法,主要是因爲在C#中用@countryCode傳輸值得時候,將'hk','pk'的數值當做了字符串來處理,

select * from PR_ServerCountry where charindex(rtrim(CountryCode), 'pk,hk')>0

select * from PR_ServerCountry where CountryCode in ('hk','pk')

 

4.排序中爲null的

此處的排序要記住是要進行兩次,第一次改變值,第二次纔是排序(?)

select UserID,UserNames 
from UserInfo 
order by case when Id is null then 1 else 0 end asc,Id asc 

5.查詢數據庫中的所有索引

SELECT CASE
           WHEN t.[type] = 'U' THEN
               '表'
           WHEN t.[type] = 'V' THEN
               '視圖'
       END AS '類型',
       SCHEMA_NAME(t.schema_id) + '.' + t.[name] AS '(表/視圖)名稱',
       i.[name] AS 索引名稱,
       SUBSTRING(column_names, 1, LEN(column_names) - 1) AS '列名',
       CASE
           WHEN i.[type] = 1 THEN
               '聚集索引'
           WHEN i.[type] = 2 THEN
               '非聚集索引'
           WHEN i.[type] = 3 THEN
               'XML索引'
           WHEN i.[type] = 4 THEN
               '空間索引'
           WHEN i.[type] = 5 THEN
               '聚簇列存儲索引'
           WHEN i.[type] = 6 THEN
               '非聚集列存儲索引'
           WHEN i.[type] = 7 THEN
               '非聚集哈希索引'
       END AS '索引類型',
       CASE
           WHEN i.is_unique = 1 THEN
               '唯一'
           ELSE
               '不唯一'
       END AS '索引是否唯一'
FROM sys.objects t
    INNER JOIN sys.indexes i
        ON t.object_id = i.object_id
    CROSS APPLY
(
    SELECT col.[name] + ', '
    FROM sys.index_columns ic
        INNER JOIN sys.columns col
            ON ic.object_id = col.object_id
               AND ic.column_id = col.column_id
    WHERE ic.object_id = t.object_id
          AND ic.index_id = i.index_id
    ORDER BY col.column_id
    FOR XML PATH('')
) D(column_names)
WHERE t.is_ms_shipped <> 1
      AND index_id > 0
ORDER BY i.[name];

6.創建遊標

   整理下游標的知識,每次都要面向百度編程

	   
		-- 定義遊標 cur_income 爲遊標的名稱.
		DECLARE cur_income CURSOR LOCAL FOR
		SELECT PC_ID,PC_Name,PC_Code FROM AWeb_ProductClass;
		--聲明遊標臨時變量
		DECLARE 
        @id_income   NVARCHAR(50),
        @name_income NVARCHAR(50),
        @code_income NVARCHAR(50);
		OPEN cur_income  --打開遊標 
        FETCH NEXT FROM cur_income INTO @id_income,@name_income,@code_income 
         --將遊標指向的數據賦值給聲明的變量 ,遊標指向結果中第一行
        
		--判斷遊標的狀態    
        --0 fetch語句成功        
        --1 fetch語句失敗或此行不在結果集中        
        --2 被提取的行不存在  
        WHILE @@FETCH_STATUS = 0   --語句成功
        BEGIN   

			// 業務場景
			DECLARE @a int=0	
			DECLARE @b int=0;	
		
			if @code_income='a,'	
			begin  
				set @a=1; 
				set @b=2; 
			end 
			else begin
				set @a=1; 
				set @b=2; 
			end

			--插入到彙總表
			INSERT INTO c(a,b,c,d,e)
			VALUES (@id_income,@name_income,@Amount,@a,@b)
			
			--執行下一行,直到完成結果集中所有行
            FETCH NEXT FROM cur_income INTO @id_income,@name_income,@code_income  
        END
        CLOSE cur_income--關閉遊標
        DEALLOCATE cur_income-- 釋放遊標

7.查全部的存儲和視圖過程

select  a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b
where a.is_ms_shipped=0 and a.object_id = b.object_id and a.[type] in ('P','V','AF')
order by a.[name] asc

8.創建一個存儲過程 

// 存儲名
ALTER PROCEDURE b (
@returnStr nvarchar(MAX) = null  OUTPUT) // 輸出returnStr值
AS
BEGIN
	SET NOCOUNT ON;
	BEGIN TRY		
		--更新續費狀態
		update a set b='1' ;
		set @returnStr ='更新成功。';
	END TRY
	BEGIN CATCH
		set @returnStr ='更新失敗。' 
		return;
	END CATCH
END

10新增字段和註釋

ALTER TABLE 表名 ADD 字段名  類型  默認值  是否爲空;
EXEC sp_addextendedproperty N'MS_Description', N'註釋內容', N'SCHEMA', N'dbo',N'TABLE', N'表名', N'COLUMN', N'字段名';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章