如何检查表,然后将其重命名

时间:2017-06-23 09:47:42

标签: sql-server-2008 bcp

这个问题类似于许多其他问题,但还有许多其他问题。

我必须创建一个查询,其中包含许多内容:

  

首先检查数据库中是否已存在表格,我知道我们可以从这个

获取
IF (EXISTS (SELECT * 
             FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_SCHEMA = 'TheSchema' 
             AND  TABLE_NAME = 'x'))
  

其次我需要更新表名,如果它已经是现有表

EXEC sp_rename 'x','y'
  

第三,我必须检查它是否存在创建它然后使用bcp将数据从文本文件加载到数据库中,因为我知道代码是这样的。

Create table x(id int, number varchar(20))

Declare @cmd varchar(200)
Set @cmd='BCP master.dbo.x IN 'filePath' -S -T f -t, -C -E'
EXEC master..XP_CMDSHELL @cmd

我分别知道每一件事我只需要你的指导如何在一个单一的Sql查询中实现所有这些。

例如:

  

我没有任何名字&x 39; x'在数据库中,所以我的查询首先检查它们是否是任何名为x的表,否则它将创建一个并从bcp加载数据,如果表已经存在,那么它将更新表的名称然后加载使用bcp的数据。

     

一旦文件加载并且我们更新了表的查询名称将再次运行并检查表名和相同的进程,所以我想我不能在我的查询中采用任何硬编码值。

更新代码:

Declare @z varchar(100)
Set @z='x' 

IF Object_ID(@z) is null
Print 'Table not EXISTS' 
Else Print 'EXISTS'

 Declare @cmd varchar(200)
Set @cmd='BCP @z IN 'filePath' -S -T f -t, -C -E'
EXEC master..XP_CMDSHELL @cmd

DECALRE @name varchar(200)
set @name= @z+'_'+(convert(varchar(16),GETDATE(),112))
EXEC sp_Rename @z,@name

前两次它工作正常,虽然我只在现有的表上工作。 第三次它将检查x表,但在第二次尝试时它已经更新到x_systemdate现在我只需要知道如何在每次查询运行时更改它。

任何帮助表示赞赏!!

1 个答案:

答案 0 :(得分:1)

您有更多选择,一个是使用动态查询完成整个事情。您还可以查看SQLCMD。我将向您展示动态SQL解决方案的快速模拟。

DECLARE @TableSchema sys.sysname = N'dbo';
DECLARE @TableName sys.sysname = N'x';
DECLARE @BackupTable sys.sysname = @TableName + '_' + CONVERT(VARCHAR(32), GETDATE(), 112);


DECLARE @SQL NVARCHAR(MAX) = N'

DECLARE @TableWithSchema NVARCHAR(256) = QUOTENAME(@TableSchema) + ''.'' + QUOTENAME(@TableName);

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_SCHEMA = @TableSchema
             AND  TABLE_NAME = @TableName))
BEGIN
  EXEC sp_rename @TableWithSchema, @BackupTable, ''OBJECT''
END

CREATE TABLE ' + QUOTENAME(@TableSchema) + '.' + QUOTENAME(@TableName) + '(
/* Column definitions here*/
);
';

EXEC sp_executesql
    @stmt = @SQL
  , @params = N'@TableSchema sys.sysname, @TableName sys.sysname, @BackupTable sys.sysname'
  , @TableSchema = @TableSchema
  , @TableName = @TableName
  , @BackupTable = @BackupTable
;

/* Do BCP here */

请注意,112日期格式(请参阅转换)不包含时间值,因此您需要更改它以允许脚本每天运行多次。例如,您可以使用select REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(32), GETDATE(), 120), ' ', ''), ':', ''), '-', '')(yyyyMMddHHmmss)代替

与往常一样,在使用动态查询时要小心并仔细检查代码!