程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sql cast,convert,QUOTENAME,exec 函數進修記載

sql cast,convert,QUOTENAME,exec 函數進修記載

編輯:MSSQL

sql cast,convert,QUOTENAME,exec 函數進修記載。本站提示廣大學習愛好者:(sql cast,convert,QUOTENAME,exec 函數進修記載)文章只能為提供參考,不一定能成為您想要的結果。以下是sql cast,convert,QUOTENAME,exec 函數進修記載正文


語法
應用 CAST:

CAST ( expression AS data_type )

應用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

參數
expression

是任何有用的 Microsoft SQL Server" 表達式。有關更多信息,請拜見表達式。

data_type

目的體系所供給的數據類型,包含 bigint 和 sql_variant。不克不及應用用戶界說的數據類型。有關可用的數據類型的更多信息,請拜見數據類型。

length

nchar、nvarchar、char、varchar、binary 或 varbinary 數據類型的可選參數。

style

日期格局款式,借以將 datetime 或 smalldatetime 數據轉換為字符數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或許字符串格局款式,借以將 float、real、money 或 smallmoney 數據轉換為字符數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型)。



將某種數據類型的表達式顯式轉換為另外一種數據類型。有關可用的數據類型的更多信息,請拜見數據類型。日期格局款式,借以將 datetime 或 smalldatetime 數據轉換為字符數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或許字符串格局款式,借以將 float、real、money 或 smallmoney 數據轉換為字符數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型)。當轉換為字符數據時輸入。
 

隱性轉換關於用戶是弗成見的。
SQL Server 主動將數據從一種數據類型轉換成另外一種數據類型。例如,假如一個 smallint 變量和一個 int 變量比擬較,這個 smallint 變量在比擬前即被隱性轉換成 int 變量。

顯式轉換應用 CAST 或 CONVERT 函數。
CAST 和 CONVERT 函數將數值從一個數據類型(部分變量、列或其它表達式)轉換到另外一個數據類型。

例如,上面的 CAST 函數將數值 $157.27 轉換成字符串 ''$157.27'':CAST ( $157.27 AS VARCHAR(10) )
CAST 函數基於 SQL-92 尺度而且優先於 CONVERT。

當從一個 SQL Server 對象的數據類型向另外一個轉換時,一些隱性和顯式數據類型轉換是不支撐的。例如,nchar 數值基本就不克不及被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支撐的。nchar 可以顯式地或許隱性地轉換成 nvarchar。

當處置 sql_variant 數據類型時,SQL Server 支撐將具有其它數據類型的對象隱性轉換成 sql_variant 類型。但是,SQL Server 其實不支撐從 sql_variant 數據隱性地轉換到其它數據類型的對象。

 SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)

  (102注解應用了ANSI日期形式,即yy.mm.dd型)

  但是,假如你願望將這個變量明白生成為datetime或smalldatetime變量,以此在特定的數據庫欄中兼容,那末你可使用以下語句:

  SELECT CAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,102) AS DATETIME

  前往值將是 yy.mm.dd 00:00:00(如12:00AM作為時光戳;

函數QUOTENAME
--功效:前往帶有分隔符的Unicode 字符串,分隔符的參加可以使輸出的字符串成為有用的Microsoft SQL Server 2005 分隔標識符。
--語法
QUOTENAME ( 'character_string' [ , 'quote_character' ] ) 

--舉例解釋:

--好比你有一個表,名字叫index
--你有一個靜態查詢,參數是表名
declare @tbname varchar(256)
set @tbname='index'
---查這個內外的數據:
print('select * from '+@tbname)
exec('select * from '+@tbname)

--如許print出來的數據是
select * from index

--由於index是字鍵字,確定失足,加上括號便可以了:
select * from [index]

--這便有了QUOTENAME,即:
print('select * from '+QUOTENAME(@tbname))
--成果:select * from [index]
exec('select * from '+QUOTENAME(@tbname))

EXEC敕令有兩個用法:履行一個存儲進程,或許履行一個靜態批次。批次是一個內容為SQL語句的字符串。
    例如:
    declare @schemaName varchar(80),@tableName varchar(80),
        @objName varchar(512);
    set @schemaName='dbo';
    set @tableName='Orders';
    set @objName=@schemaName+'.'+@tableName;
    exec('select count(*) from '+@objName);

    留意,在exec的括號裡,只許可是字符串變量、字符串常量存在。不許可在這裡挪用函數或許應用case表達式。
    上面的代碼是毛病的:
        exec('select count(*) from '+quotename(@objName));

    所以,根本的辦法是將語句保留到一個變量裡,例如:
        set @sql='...';
        exec(@sql);
    這就不存在上述限制了。

    1 EXEC沒有接口
        Exec的獨一輸出是字符串。一個靜態批次無權拜訪挪用它的批次內所界說的部分變量:
            declare @i int
            set @i=1;
            declare @sql varchar(255)
            set @sql='select * from dbo.orders where rderid=@i';
            exec(@sql);
        失足:必需聲明標質變量@i
        緣由照樣@i不克不及放在''以內,它只能經由過程字符串聯接靜態的嵌入到SQL語句裡:
            set @sql='select * from dbo.orders where rderid='+cast(@i as varchar(10));

        變量與字符串聯接會激發所謂的SQL注入平安隱患,假如變量包括了字符串。要防患SQL注入的一個方法是限制
    字符串的年夜小。
        這類銜接會對機能形成映像。SS會為每一個字符串零丁創立一個履行籌劃,不管兩個字符串能否是一個形式。為此,
    上面顯示了一個例子:
        起首消除cache裡的履行籌劃:
            DBCC freeproccache;
        然後履行上面的代碼三次,分離將@i設置為10248,10249,10250
            DECLARE @i AS INT;
            SET @i = 10248;

            DECLARE @sql AS VARCHAR(52);
            SET @sql = 'SELECT * FROM dbo.Orders WHERE rderID = '
              + CAST(@i AS VARCHAR(10)) + N';';
            EXEC(@sql)
        最初查詢sys.syscacheobjects:
            SELECT cacheobjtype, objtype, usecounts, sql
            FROM sys.syscacheobjects
            WHERE sql NOT LIKE '%cache%'
              AND sql NOT LIKE '%sys.%';
        成果顯示為:
            它會為每次查詢生成一個履行籌劃。和一個參數化的履行籌劃。

    EXEC也沒有輸入參數。缺省情形下,exec將前往該次查詢的輸入給挪用者。假如願望將該成果保留到變量裡,那就必需
應用Insert EXEC語法,並從內外重新讀取該數據,然後貯存到目的變量裡。
    DECLARE
      @schemaname AS NVARCHAR(128),
      @tablename  AS NVARCHAR(128),
      @colname    AS NVARCHAR(128),
      @sql        AS NVARCHAR(805),
      @cnt       AS INT;

    SET @schemaname = N'dbo';
    SET @tablename  = N'Orders';
    SET @colname    = N'CustomerID';
    SET @sql = N'SELECT COUNT(DISTINCT '
      + QUOTENAME(@colname) + N') FROM '
      + QUOTENAME(@schemaname)
      + N'.'
      + QUOTENAME(@tablename)
      + N';';

    CREATE TABLE #T(cnt INT);
    INSERT INTO #T
      EXEC(@sql);
    SET @cnt = (SELECT cnt FROM #T);
    SELECT @cnt;
    DROP TABLE #T;

    留意假如忘卻輸出最初的一條語句“Drop 。。。”,那末就會湧現上面的使人憎惡的毛病:
        數據庫中已存在名為 '#T' 的對象。

    在下面這段法式裡,創立了一個暫時表,它關於靜態批次是可見的。所以可以修正下面的法式為:
        SET @sql = N'INSERT INTO #T(cnt) SELECT COUNT(DISTINCT '
          + QUOTENAME(@colname) + N') FROM '
          + QUOTENAME(@schemaname)
          + N'.'
          + QUOTENAME(@tablename)
          + N';';

        CREATE TABLE #T(cnt INT);
        EXEC(@sql);
        SET @cnt = (SELECT cnt FROM #T);
        SELECT @cnt;
        DROP TABLE #T;
    由於EXEC的履行是在Create Table以後,所以Insert語句可以移到@sql的界說裡。

    2 變量的銜接
        在SS2000裡,EXEC優於sp_executesql的一點是,它支撐輸出的代碼長度要長一些。固然,從技巧上說後者的
    輸出代碼字符串是NTEXT類型,平日願望用一個部分變量來保留它。然則,部分變量是不克不及聲明成年夜對象類型的。
    所以,現實上sp_executesql的最年夜支撐的字符串長度是Unicode字符串的長度(NVARCHAR,4000個字符)。而
    EXEC,則支撐慣例的字符串(VARCHAR),即8000個字符。
        並且,EXEC支撐多個變量的銜接,每一個變量最年夜有8000個字符。

        不外在SS2005裡,變量類型可所以VARCHAR(max),最年夜為2G。

    3 EXEC AT  
        這是05裡的新語法。履行長途主機上的靜態SQL語句

加上 N 代表存入數據庫時以 Unicode 格局存儲。
N'string' 表現string是個Unicode字符串

Unicode 字符串的格局與通俗字符串類似,但它後面有一個 N 標識符(N 代表 SQL-92 尺度中的國際說話 (National Language))。N 前綴必需是年夜寫字母。例如,'Michél' 是字符串常量而 N'Michél' 則是 Unicode 常量。Unicode 常量被說明為 Unicode 數據,而且不應用代碼頁停止盤算。Unicode 常量確切有排序規矩,重要用於掌握比擬和辨別年夜小寫。為 Unicode 常量指派以後數據庫的默許排序規矩,除非應用 COLLATE 子句為其指定了排序規矩。Unicode 數據中的每一個字符都應用兩個字節停止存儲,而字符數據中的每一個字符則都應用一個字節停止存儲。有關更多信息,請拜見應用 Unicode 數據。

Unicode 字符串常量支撐加強的排序規矩

數據庫名是一個標識符,表名也是一個標識符,在SQL SERVER中標識符分為兩類:

標識符有兩類:

慣例標識符

相符標識符的格局規矩。在 Transact-SQL 語句中應用慣例標識符時不消將其分隔。

SELECT *FROM TableXWHERE KeyCol = 124

分隔標識符

包括在雙引號 (") 或許方括號 ([ ]) 內。相符標識符格局規矩的標識符可以分隔,也能夠不分隔。

SELECT *FROM [TableX]     --Delimiter is optional.WHERE [KeyCol] = 124 --Delimiter is optional.

在 Transact-SQL 語句中,對不相符一切標識符規矩的標識符必需停止分隔。

SELECT *FROM [My Table]   --Identifier contains a space and uses a reserved keyword.WHERE [order] = 10  --Identifier is a reserved keyword.

慣例標識符和分隔標識符包括的字符數必需在 1 到 128 之間。關於當地暫時表,標識符最多可以有 116 個字符。

二者主要的差別:慣例標識符必需嚴厲遵照定名的劃定,而分隔標識符則可以不遵照定名劃定,只需用[],""分隔出來便可以。

標識符格局:
  
  1、標識符必需是同一碼(Unicode)2.0尺度中劃定的字符,和其他一些說話字符。如漢字.
  
  2、標識符後的字符可所以(除前提一)“_”、“@”、“#”、“$”及數字。
  
  3、標識符不許可是Transact-SQL的保存字。
  
  4、標識符內不許可有空格和特別字符。
  
  別的,某些以特別符號開首的標識符在SQL SERVER 中具有特定的寄義。

如以“@”開首的標識符表現這是一個部分變量或是一個函數的參數;以#開首的標識符表現這是一個暫時表或是一存儲進程。

以“##”開首的表現這是一個全局的暫時數據庫對象。T

ransact-SQL的全局變量以“@@”開首。

標識符最多可以包容128個字符。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved