① 用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*/