如何在

时间:2016-12-12 00:20:57

标签: sql sql-server-2008 sql-update sql-insert

我有这个存储过程。

DECLARE @itWorks nvarchar (39)
SET @itWorks = @dbName + '.' +@tblName

INSERT INTO sampleDatabase.dbo.WorkFlowCopy
       ([ID]
      ,[ActivityDefinitionID]
      ,[ParentID]
      ,[Caption]
      ,[Description]
      ,[ShortDescription]
      ,[Name]
      ,[Order]
      ,[ReferenceNumber]
      ,[ShowOnNavigation]
      ,[Status]

EXEC('SELECT * FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='+@userID+';Password=' +@password+''').'+@itWorks+' sdb1')

UPDATE sampleDatabase.dbo.WorkFlowCopy 
SET ServerName = @serverName, 
    DBName = @dbName 
WHERE ServerName = NULL AND DBName = NULL

该查询的功能是将来自其他服务器的值插入特定数据库。这就是我使用动态查询的原因。在那个insert语句之后,我的特定数据库表中的列(ServerName,DBName)将变为NULL,因为我没有在其中插入任何值。

所以我之后使用UPDATE查询,但它没有用。 "(0行(s)受影响)"有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

您的WHERE条件不正确。 NULL不是一个值,因此请勿与NULL进行比较,而是使用IS NULL

/*Change*/
WHERE ServerName = NULL AND DBName = NULL
/*To*/
WHERE ServerName IS NULL AND DBName IS NULL

也就是说,在先前的SELECT语句中设置这些值会更有效率。在任何情况下,您都应该更改SELECT *以明确指定列值。由于架构更改,您当前的代码存在破坏的风险。因此,将ServerName和DBName添加到INSERT并更改动态SELECT,如下所示:

EXEC('SELECT  ID,
        ActivityDefinitionID,
        ParentID,
        ...,
        Status,
        '+@serverName+',
        '+@dbName'
FROM ...')