日期:2014-05-17  浏览次数:20358 次

真心求高手来帮我补充一下这个SQL语句,往下不会写了,真的需要高手,版主来看看吧。需求很BT。关于自动生成SQL语句的
本帖最后由 wdzczy 于 2013-01-22 20:13:09 编辑
看下代码,是否能理解我要表达的意思:


--是sql2008的环境
DECLARE @table VARCHAR(64)
SET @table = '这里需要动态生成DBO类型的表名'--这里又怎么写?
DECLARE @name VARCHAR(128),@longname VARCHAR(1024)
SET @name = ''
SET @longname = ''
DECLARE cur CURSOR FOR

SELECT s.name +',' FROM sys.syscolumns s
INNER JOIN sysobjects s2 ON s.id=s2.id 
WHERE s2.name = @table
OPEN cur

FETCH NEXT FROM cur INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
 set @longname = @longname + @name
 FETCH NEXT FROM cur INTO @name
END

SET @longname = LEFT(@longname,LEN(@longname)-1)

--if(DB1数据库内的某些表含有主键)---求这条语句
执行以下SQL语句

PRINT ' set identity_insert '+@table +' on insert into ' + @table + '(' + @longname + ') select '+'' + @longname + ''+ ' From [服务名].数据库名.dbo.' + @table +' set identity_insert '+@table +' off '

--if(不包含主键)---求这条语句
--则执行以下SQL语句
--SQL语句我暂时省略了

CLOSE cur
DEALLOCATE cur




我求的那的判断语句以及动态表名的生成不知道大家看懂没有。说实话这样的需求我觉得编程来方便一些,但是老大说了,能用SQL实现的就用SQL实现,磨练一下自己,我目前就想到这些了,剩下的我真脑袋疼,不知道咋整了。

现在以我的这个SQL语句只能一条一条的换表名生成,如果有2000个表我估计我复制粘贴就得累死,我想实现自动化一次性全部生成。还有我之所以加上那2个判断是因为在实际使用过程中的需求。


------解决方案--------------------
--if(不包含主键)---求这条语句
--则执行以下SQL语句
--SQL语句我暂时省略了

我猜你是想动态生成表的字段然后插入吧?下面是动态生成表字段的语句,其实如果没有主键,直接select * 也可以,看你自己选择了,2天睡了5个小时,没精神帮你看:

DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',' + QUOTENAME(name)
FROM    syscolumns
WHERE   id = OBJECT_ID('表名')
        AND name NOT IN ( '不希望显式的列' )
SET @s = STUFF(@s, 1, 1, '')
EXEC('select '+@s+' from 表名  ')
  
------解决方案--------------------
使用 select * from sys.tables where schemaid=1 可以读出数据库中所有dbo表格的名称。
最外层再加个course 循环表名即可。
------解决方案--------------------
Set NOCOUNT ON
select 
case when b.column_id is null then '' else ' set identity_insert '+a.name +' on ' end as IdentityOn, 
a.name,
stuff((select ','+b.name from sys.syscolumns b
where a.object_id = b.id 
order by b.id,b.colorder 
for xml path('') ) ,1,1,'') longname , 
case when b.column_id is null then '' else ' set identity_insert '+a.name +' off ' end as IdentityOff
into #ta 
from sys.tables a