當前位置:首頁 » 編程語言 » sqlalterfunction
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlalterfunction

發布時間: 2023-07-14 17:44:54

① 用sql語言如何查詢一個月中最後一個周五是哪天

用SQL語言如何查詢一個月中最後一個周五是哪天
SELECT DBO.SHFGETLAST5('2013','06')
輸出結果
2013-06-28 00:00:00.000

使用的函數:
ALTER function SHFgetlast5 --求給出年、月的最後一個星期五
(@YEAR VARCHAR(4),--年份
@MONTH VARCHAR(2))--月份
RETURNS DATETIME
BEGIN
DECLARE @DATE DATETIME
SET @DATE=DATEADD(MM,1,CONVERT(DATETIME,@YEAR+'-'+@MONTH+'-01',120))--求出下個月1號的日期。
SET @DATE=dateadd(D,6,@DATE)-DATEPART(W,@DATE)--求最近的周五的日期(可能是下月第一個周五)
IF MONTH(@DATE)!=CONVERT(INT,@MONTH)--如果不是要求的月份(是下個月的第一個周五)
SET @DATE=DATEADD(WW,-1,@DATE)--則向前推一周
RETURN @DATE
END
GO

② SQL語句可以聲明使用數組么

sql沒有數組類型的,不過你可以自定一個varchar類型的變數,里邊裝字元串,用逗號分開,然後進行分割就成了數組,第一步:數組長度的函數 SQL code Alter Function arrLen(@string varchar(1000),@SpaceMark Varchar(200)) --@String 眼拆分的字元串 @SpaceMark 分割符 Returns intAsBeginDeclare @i Int Set @i = (Len(@string) - Len(Replace(@string,@Spacemark,'')))/Len(@SpaceMark)Return(@i)End第二步:按索引值取數組中的數據 SQL code Alter Function arrList(@String varchar(8000),@SpaceMark Varchar(8000),@arrStation int) returns varchar(8000)AsBeginDeclare @newString varchar(8000) Declare @ReturnString Varchar(8000) Set @NewString = @String Declare @i intSet @i = 0if(@arrStation>0 And @arrStation<=Dbo.arrLen(@String,@SpaceMark))BeginWhile(@i<@arrStation)BeginSet @NewString = SubString(@NewString,CharIndex(@SpaceMark,@NewString)+1,Len(@NewString)) Set @i = @i + 1EndEndIf(@arrStation<0)BeginSet @ReturnString = '上標越界'EndElse If(@arrStation<dbo.arrLen(@String,@SpaceMark))BeginSet @ReturnString = SubString(@NewString,1,CharIndex(@SpaceMark,@NewString)-1)EndElse if(@arrStation=dbo.arrLen(@String,@SpaceMark))BeginSet @ReturnString = @newStringEndElseBeginSet @ReturnString = '下標越界'EndReturn(@ReturnString) End測試程序:

③ MSSQL中遇到存儲過程加密出錯不能查看

分類: 電腦/網路 >> 互聯網
問題描述:

我以前用的時候好好的,可以添加存儲過程,也可以查看,修改等等.

可是最近突然不能查看了,一查仔禪喊看就報

錯誤20585 ****** Encrypted object is not transferable, and script can not be generated. ******

網上說是襲租加密了,我用了他們的解密函數也能解密和查看了,可是我想知道是為什麼突然發生這種現象呢?

解析:

存儲過程解密(破解函數,過程,觸發器,視圖.僅限於SQLSERVER2000)

--*/

/*--調用示例:

--解密指定存儲過程

exec sp_decrypt '存儲過程名'

--*/

create PROCEDURE sp_decrypt(@objectName varchar(50))

AS

begin

begin tran

declare @objectname1 varchar(100),@varbin varbinary(8000)

declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000),@sql5 nvarchar(4000),@sql6 nvarchar(4000),@sql7 nvarchar(4000),@sql8 nvarchar(4000),@sql9 nvarchar(4000),@sql10 nvarchar(4000)

DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)

declare @i int,@status int,@type varchar(10),@parentid int

declare @colid int,@n int,@q int,@j int,@k int,@encrypted int,@number int

select @type=xtype,@parentid=parent_obj from sysobjects where id=object_id(@ObjectName)

create table #temp(number int,colid int,ctext varbinary(8000),encrypted int,status int)

insert #temp SELECT number,colid,ctext,encrypted,status FROM sy *** ents WHERE id = object_id(@objectName)

select @number=max(number) from #temp

set @k=0

while @k<=@number

begin

if exists(select 1 from sy *** ents where id=object_id(@objectname) and number=@k)

begin

if @type='P'

set @sql1=(case when @number>1 then 'ALTER PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '

else 'ALTER PROCEDURE '念野+ @objectName+' WITH ENCRYPTION AS '

end)

if @type='TR'

set @sql1='ALTER TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '

if @type='FN' or @type='TF' or @type='IF'

set @sql1=(case @type when 'TF' then

'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '

when 'FN' then

'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'

when 'IF' then

'ALTER FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'

end)

if @type='V'

set @sql1='ALTER VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 '

set @q=len(@sql1)

set @sql1=@sql1+REPLICATE('-',4000-@q)

select @sql2=REPLICATE('-',4000),@sql3=REPLICATE('-',4000),@sql4=REPLICATE('-',4000),@sql5=REPLICATE('-',4000),@sql6=REPLICATE('-',4000),@sql7=REPLICATE('-',4000),@sql8=REPLICATE('-',4000),@sql9=REPLICATE('-',4000),@sql10=REPLICATE('-',4000)

exec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql10)

end

set @k=@k+1

end

set @k=0

while @k<=@number

begin

if exists(select 1 from sy *** ents where id=object_id(@objectname) and number=@k)

begin

select @colid=max(colid) from #temp where number=@k

set @n=1

while @n<=@colid

begin

select @OrigSpText1=ctext,@encrypted=encrypted,@status=status FROM #temp WHERE colid=@n and number=@k

SET @OrigSpText3=(SELECT ctext FROM sy *** ents WHERE id=object_id(@objectName) and colid=@n and number=@k)

if @n=1

begin

if @type='P'

SET @OrigSpText2=(case when @number>1 then 'CREATE PROCEDURE '+ @objectName +';'+rtrim(@k)+' WITH ENCRYPTION AS '

else 'CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '

end)

if @type='FN' or @type='TF' or @type='IF'--剛才有錯改一下

SET @OrigSpText2=(case @type when 'TF' then

'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns @b table(a varchar(10)) with encryption as begin insert @b select @a return end '

when 'FN' then

'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns char(1) with encryption as begin return @a end'

when 'IF' then

'CREATE FUNCTION '+ @objectName+'(@a char(1)) returns table with encryption as return select @a as a'

end)

if @type='TR'

set @OrigSpText2='CREATE TRIGGER '+@objectname+' ON '+OBJECT_NAME(@parentid)+' WITH ENCRYPTION FOR INSERT AS PRINT 1 '

if @type='V'

set @OrigSpText2='CREATE VIEW '+@objectname+' WITH ENCRYPTION AS SELECT 1 '

set @q=4000-len(@OrigSpText2)

set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)

end

else

begin

SET @OrigSpText2=REPLICATE('-', 4000)

end

--start counter

SET @i=1

--fill temporary variable

SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))

--loop

WHILE @i<=datalength(@OrigSpText1)/2

BEGIN

SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^

(UNICODE(substring(@OrigSpText2, @i, 1)) ^

UNICODE(substring(@OrigSpText3, @i, 1)))))

SET @i=@i+1

END

set @varbin=cast(@OrigSpText1 as varbinary(8000))

set @resultsp=(case when @encrypted=1

then @resultsp

else convert(nvarchar(4000),case when @status&2=2 then unpress(@varbin) else @varbin end)

end)

print @resultsp

--execute( @resultsp)

set @n=@n+1

end

end

set @k=@k+1

end

drop table #temp

rollback tran

end

GO

④ 如何在SQL語句中使用FUNCTION

1、function是SQL的函數
是由一個或多個 Transact-SQL 語句組成的子程序,可用於封裝代碼以便重新使用。Microsoft® SQL Server™ 並不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。
可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。每個完全合法的用戶定義函數名 (database_name.owner_name.function_name) 必須唯一。
必須被授予 CREATE FUNCTION 許可權才能創建、修改或除去用戶定義函數。不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當許可權。若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 許可權。
在函數中,區別處理導致刪除語句並且繼續在諸如觸發器或存儲過程等模式中的下一語句的 Transact-SQL 錯誤。在函數中,上述錯誤會導致停止執行函數。接下來該操作導致停止喚醒調用該函數的語句。
用戶定義函數的類型
2、Procere是SQL的存儲過程
存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。在ORACLE中,若干個有聯系的過程可以組合在一起構成程序包。
存儲過程是利用SQL Server所提供的Transact-SQL語言所編寫的程序。Transact-SQL語言是SQL Server提供專為設計資料庫應用程序的語言,它是應用程序和SQL Server資料庫間的主要程序式設計界面。它好比Oracle資料庫系統中的PL-SQL和 Informix的資料庫系統結構中的Informix- 4GL語言。這類語言主要提供以下功能,讓用戶可以設計出符合引用需求的程序:
1)、變數說明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程式控制制命令(if…else…、while….)
4)、內部函數

⑤ 使用SQL如何把用逗號等字元隔開的字元串轉換成列表

如何把用逗號等字元隔開的字元串轉換成列表,下面依逗號分隔符為例:

比如有一個字元串,其值為:香港,張家港,北京,上海
用SQL把這個字元串轉換成列表的方法是:
1、方法一

WITH A AS (SELECT '香港,張家港,北京,上海' A FROM DUAL)
SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city FROM
(
SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C
FROM(
SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM A
CONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1
)
)

⑥ 查詢兩個日期的時間差(精確到小時),同時剔除日期之間的周六周日,SQL語句怎麼寫

先創建一個函數計算時間差
Alter function dbo.fn_test(@begin datetime,@end datetime)
returns int
As
BEGIN
declare @i int,@j int
set @i=0
set @j=0
if @end<@begin
begin
declare @t datetime
set @t=@end
set @end=@begin
set @begin=@t
end
while dateadd(hh,@i,@begin) <@end
begin
if datepart(weekday,dateadd(hh,@i,@begin)) not in(1,7)
set @j=@j+1
set @i=@i+1
end
return @j
end
調用函數
select dbo.fn_test(@begin,@end)

⑦ sql 拆分字元串

alter FUNCTION [dbo].[SpitString]
(
@string nvarchar(500),--被分的字元串
@sp nvarchar(100) --分隔符
)
RETURNS
@_strings TABLE
(
id int,
string nvarchar(64),
inx int,
str1 nvarchar(65)
)
AS
BEGIN
declare @count int --計數
set @count=0
declare @index int
declare @one nvarchar(64)--取下來的一節
set @index=Charindex(@sp,@string)
while(@index>0)
begin
set @one=left(@string,@index-1)
set @count=@count+1
insert into @_strings (id,string,inx,str1) values(@count,@one,@index,@string)
set @string=right(@string,len(@string)-@index)
set @index=Charindex(@sp,@string)
end
insert into @_strings (id,string,inx,str1) values(@count+1,@string,@index,@one)
RETURN
END
go
調用:
SELECT * FROM [dbo].[SpitString] ('asdads,ad,sadsa,d,w,dsa,dsa,d,sad,sa,' ,',')

請注意:為了調試方便,便於理解森旦,返回的表中多蘆春核加入了兩個欄位,這樣,字串分解過程一目瞭然,您可以表值參數及插入語句中將其去掉。

SQL SERVER調試方法:1.在查詢分析器中進行調試,可以查看執行結果,錯誤報告,錯誤行定位等,還可以進行效率分析。也可以加入一些調試中間結果或欄位(如本例)進行調試。
2.跟蹤指令陪掘執行進行調試:參過事件探查器,打開,文件,新建,跟蹤,選擇伺服器及登錄參數,選擇一個模板,點擊運行,即可開始跟蹤SQLSERVER相關動作

⑧ 超難的Sql查詢(縱向轉橫向+分組統計)

使用自定議函數實現:

先建立一個取某列值的函數(getcol):輸入商品編號,返回該編號對應的銷售單號。

再執行這個語句即可:
select 商品編號,銷售單號=dbo.getcol(商品編號) from
(select distinct 商品編號 from 表名) a

表結構:
CREATE TABLE 表名(商品編號 int,銷售單號 varchar(20))

函數腳本(如果表結構一致,直接復制到查詢分析器即可執行):
alter FUNCTION getcol
(@spbh int)
RETURNS varchar(8000)
AS
BEGIN
declare @f1 varchar(100),@result varchar(1000),@deli char(1)
set @deli=','
set @result=''

DECLARE ddcursor CURSOR for select 銷售單號 from 表名 where 商品編號=@spbh
open ddcursor
fetch next from ddcursor into @f1
while @@fetch_status!=-1
begin
set @result=@result+@deli+isnull(@f1,'')
fetch next from ddcursor into @f1
end
close ddcursor
deallocate ddcursor
set @result=substring(@result,2,1000)

return (@result)
end

GO
註:想了好久,沒有找到更加通用的函數和方法,只能用這個方法,當然,也可以用存儲過程實現,但那樣您就不能用簡單的查詢語句來完成。
而使用函數,在前台只調用簡單查詢語句即可完成。

⑨ 關於數字金額轉換大寫金額,sql語句

ALTER FUNCTION [dbo].[fn_NumberToChinese]( @s_money varchar(50)) /*數值類型*/
RETURNS VARCHAR(80) AS
BEGIN /*FUN*/

DECLARE @c_money VARCHAR(12) /* s_money */
DECLARE @m_string VARCHAR(22) /* 分角圓拾佰仟萬拾佰仟億 */
DECLARE @n_string VARCHAR(20) /* 壹貳叄肆伍陸柒捌玖 */
DECLARE @len int /* 金額字元串的長度 */
DECLARE @is_zero bit /* 判斷是否為0, 1-true 0-false */
DECLARE @i int /* 循環變 */
DECLARE @n char /* 金額內各個位的數值 */
DECLARE @tmp decimal
DECLARE @b_string VARCHAR(80)
DECLARE @z_count VARCHAR(80)

set @b_string = ''
select @m_string = '分角圓拾佰仟萬拾佰仟億拾佰仟萬'
select @n_string = '壹貳叄肆伍陸柒捌玖'
select @tmp = ROUND(cast(@s_money as decimal(20,3)),1) * 100 /* 去小數點 */
select @c_money = RTRIM(LTRIM(cast(@tmp as varchar(12)))) /* 去除首尾空格 */
select @len = len(@c_money) /* 獲取長度 */

IF (@len > 11)
begin
select @b_string = '超出范圍'
RETURN @b_string
end

select @is_zero = 1
select @z_count = 0
select @i = 0
WHILE @i < @len
begin /* while */
select @i = @i + 1

select @n = substring(@c_money,@i,1) /* 逐個去出數字 */
IF (@n = '0')
begin
/*if no.1*/
IF (@len-@i=6 OR @len-@i=2 OR @len=@i)
begin/* if no.2 */
IF (@is_zero = 1)
begin/* if no.3 */
select @b_string = substring(@b_string,1,len(@b_string)-1)
select @is_zero = 0
end/* if no.3 */

IF (@len-@i=6)
begin
select @b_string = @b_string + '萬'
end

IF @len-@i=2
begin
select @b_string = @b_string + '圓'
end

IF @len = @i
begin
select @b_string = @b_string + '整'
end

select @z_count = 0
end/* if no.2 */
ELSE
begin/* if no.2 */
IF @z_count = 0
begin
select @b_string = @b_string + '零'
select @is_zero = 1
END
select @z_count = @z_count + 1
end/* if no.2 */
end/*if no.1*/
ELSE
begin/*if no.1*/
select @b_string = @b_string + substring(@n_string,cast(@n as int),1) + substring(@m_string,@len-@i+1,1)
select @z_count = 0
select @is_zero = 0
end/*if no.1*/

END /* while */
RETURN @b_string
END /*FUN*/