行换列:
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([a] [int],[b] [int],[c] [int])
INSERT INTO [tb]
SELECT '3','9','5' UNION ALL
SELECT '5','2','7' UNION ALL
SELECT '6','3','8'
--SELECT * from [tb]
-->SQL查询如下:
select value maxnum from tb unpivot(value for type in(a,b,c)) b
########################################
列换行:
待补充 ......
---上个月月初第一天
select CONVERT(varchar(12) , DATEADD(mm,DATEDIFF(mm,0,dateadd(mm,-1,getdate())),0), 112 )
---上个月月末最后一天
select CONVERT(varchar(12),dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate()),0)), 112 )
1. 显示本月第一天
SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0)
select convert(datetime,convert(varchar(8),getdate(),
120)+'01',120)
2. 显示本月最后一天
select dateadd(day,-1,convert(datetime,convert
(varchar(8),dateadd(month,1,getdate()),120)+'01',120))
SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))
3. 上个月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))
4. 本月的第一个星期一i
select DATEADD(wk,DATEDIFF(wk,0, dateadd(dd,6-datepart(
day,getdate()),getdate())),0)
5. 本年的第一天
SELECT DATEADD(yy,DATEDIFF(yy,0,getdate()),0)
6. 本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))
7. 去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy,DAT ......
select [name] from sysdatabases order by name--得到数据库中所有的库名
select [name] from sysobjects where xtype='U'and [name]<>'dtproperties' order by [name]--得到数据库表中的列表
select [name] from sysobjects where xtype='V' and [name]<>'syssegments' and [name]<>'sysconstraints' order by [name]--视图
select [name] from sysobjects where xtype='P'and [name]<>'dtproperties' order by [name]--存储过程 ......
向高手请教一个问题:
当我执行:
use master
exec xp_cmdshell 'osql /S musqlserver /U sa /P mypwd /d haodb /Q "select top 10 * from trandetail" /o C:\my1.xls'
以上执行成功,会产生新文件:C:\my1.xls'
然后我想将此文件直接copy到另一台电脑中[已建连接]
执行
EXEC xp_cmdshell 'copy C:\my1.xls \\192.168.42.42\d$'
时候,系统会提示"拒绝访问"
而在DOS窗口中执行:
C:\my1.xls \\192.168.42.42\d$ 则没有任何问题
我想应该是用户权限的问题
因为在sql中,用户是sa
在DOS中,用户则是administrator
那我应该怎么做??
先建立共享信用关系
master..xp_cmdshell 'net use \\192.168.42.42\d$ 123 /user:domain\administrator'
关于net use的用法看帮助。
exec xp_cmdshell 'net use Z: \\192.168.42.42\d$ /user:domain\administrator'
exec xp_cmdshell 'copy C:\my1.xls Z:\'
exec xp_cmdshell 'net use Z: /del'
......
USE master
GO
DECLARE @dbname sysname
SET @dbname='TEST' --这个是要删除的数据库库名
DECLARE @s NVARCHAR(1000)
DECLARE tb CURSOR local FOR
SELECT s='KILL '+CAST(spid AS NVARCHAR)
from master..sysprocesses
WHERE dbid=DB_ID(@dbname)
OPEN tb
FETCH next from tb INTO @s
WHILE @@FETCH_STATUS=0
BEGIN
EXEC(@s)
FETCH next from tb INTO @s
END
CLOSE tb
DEALLOCATE tb
EXEC('DROP DATABASE ['+@dbname+']') ......
将列转换为行,相当于将表结构旋转90度
T_Student 表
Stud_ID
Sex
Name
1
男
Tom
2
女
Anne
3
男
Jack
执行: Exec proColumnToRow ’T_Student’,’Name’,’ New_ID’
转换后的表
New_ID
Tom
Anne
Jack
Stud_ID
1
2
3
Sex
男
女
男
--将列转换为行
create proc proColumnToRow
@tbname sysname, --要处理的表名
@fdname sysname, --某一列的值转换为新表的列
@new_fdname sysname='' --将源表的列转换为新列的值。@new_fdname为新列的列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
@s3 varchar(8000) , @s4 varchar(8000),
@s5 varchar(8000) , @i varchar(10)
select
@s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select
@s1 = @s1 + ',@' + @i + ' varchar(8000)',
&n ......