由于插入的数据库是有用户输入的数据决定,如有三个数据库DB1,DB2,DB3,用户输入1就对DB1进行插入操作,依次类推。知道要用动态SQL但具体怎么做还不清楚。请教!

解决方案 »

  1.   

    create proc spInsertTest @dbChoice int,其它参数...
    as
    declare @sql varchar(8000),@databaseName sysname
    set @sql = ''
    set @databaseName = ''
    ----根据参数确定数据库名称
    set @databaseName = 
    CASE @dbChoice
        WHEN 1 THEN 'database1'
        WHEN 2 THEN 'database2'
        WHEN 3 THEN 'database3'
    END
    if @sql <> ''
    begin
        ----构建插入新行的SQL字符串
        set @sql = 'Insert ' + @databaseName + '.tablename(columnList) values(' + 值列表 + ')'
        ----执行SQL字符串
        EXEC(@sql)
    end
    GO
      

  2.   

    抱歉,更正一下,上面的回复中插入新行时少了dbowner:    ----构建插入新行的SQL字符串
        set @sql = 'Insert ' + @databaseName + '.DBO.tablename(columnList) values(' + 值列表 + ')'
        ----执行SQL字符串
      

  3.   

    抱歉,更正下,是插入到一个数据库的3个不同的表,其他都一样。另外dbowner不要有什么影响么?
      请教!
      

  4.   


    --dbowner数据库用户用来指出哪一个人可以访问哪一个数据库.在一个数据库中,用户ID
    惟一标识一个用户,用户对数据的访问权限以及对数据库对象的所有关系都是通过用
    户账号来控制的.用户账号总是基于数据库的即两个不同数据库中可以有两个相同
    的用户账号.
    在数据库中,用户账号与登录账号是两个不同的概念.一个合法的登录账号只表
    明该账号通过了NT 认证或SQL Server 认证,但不能表明其可以对数据库数据和数据
    对象进行某种或某些操作,所以一个登录账号总是与一个或多个数据库用户账号(这
    些账号必须分别存在相异的数据库中)相对应,这样才可以访问数据库例如登录
    账号sa 自动与每一个数据库用户dbo 相关联.
      

  5.   

    create proc spInsertTest @tableChoice int,其它参数...
    as
    declare @sql varchar(8000),@TableName sysname
    set @sql = ''
    set @TableName = ''
    ----根据参数确定数据库名称
    set @TableName = 
    CASE @tableChoice
        WHEN 1 THEN 'table1'
        WHEN 2 THEN 'table2'
        WHEN 3 THEN 'table3'
    END
    if @sql <> ''
    begin
        ----构建插入新行的SQL字符串
        set @sql = 'Insert ' + @TableName + '(columnList) values(' + 值列表 + ')'
        ----执行SQL字符串
        EXEC(@sql)
    end
    GO