2015-09-07 102 views
1

創建功能的代碼,我有DDL代碼,以創建一個從SQLCMD和其他特定的SQL Server客戶端完美運行的函數:運行不SQLCMD

/* 
* Émulo de la función LPAD() de Oracle 
*/ 
CREATE FUNCTION LPAD 
(
    @cadena VARCHAR(MAX), -- Texto de partida 
    @tamano INT,   -- Tamaño de la cadena resultante 
    @relleno CHAR   -- Carácter de relleno 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    return REPLICATE(@relleno, @tamano - LEN(@cadena)) + @cadena; 
END 
GO 

但是,它通常不會從跨DBMS客​​戶端上運行( SQL小提琴,DBeaver,HeidiSQL ...):

[102]'@cadena'附近語法不正確。

我懷疑這與GO批處理分隔符沒有執行有關。如果是這樣的話,是否有其他語法?

+0

您需要告訴那些客戶您正在使用不同的分隔符。在SQL Fiddle中,您可以使用最初顯示'[[; ]在源代碼編輯器下面。其他SQL客戶端應該有類似的選項。 –

+0

@a_horse_with_no_name我改變了'[去]'編譯模式,但仍然不能使用該函數,還有什麼缺失? [sqlFiddle](http://sqlfiddle.com/#!6/9f008/3) –

+2

在SQL Server中,您可以**將**用戶寫入的函數用模式/所有者作爲前綴:'SELECT dbo.LPAD('hola' ,10,'+');'http://sqlfiddle.com/#!6/9f008/4 –

回答

2

要總結我的意見:

在SQL標準的分隔符是;

但是,運行一個代碼塊包含嵌入分號時(例如創建存儲過程時)的標準分隔符不能被應用爲在這種情況下,不會作爲單個語句被髮送。

對於這些情況的SQL客戶機通常具有限定用於標記的塊的端部的其它分隔的一些方式,並且通常具有比;

微軟的優先級高稱此爲「備用定界符」該「批量分離「並決定爲此使用GO,所有Microsoft工具都堅持這一點。在SSMS中,這個批次分隔符實際上可以配置爲其他內容。

Oracle的SQL * Plus(和SQL Developer)爲此使用/

其他SQL客戶端允許SQL腳本中的動態定義,通常使用delimiter(或類似的)來更改後續語句的分隔符。

因爲我從來沒有用過DBeaver或HeidiSQL,所以我不能說出這些是如何在這些SQL客戶端中完成的。

+0

我還沒有機會測試他們是否實際工作,但分隔符是DBeaver中的連接設置和一個打開文本框的按鈕在HeidiSQL中。我以前沒有注意過,因爲我不知道我必須去尋找它。 –