在IF语句中使用SELECT语句中的表的变量

时间:2016-10-20 14:47:21

标签: sql-server dynamic-sql sp-executesql

我已经找到了解决方案,但答案并不足以解决我的问题。

所以我有这个声明:

IF NOT EXISTS
(SELECT InternalRepositoryId FROM Tfs_GitInterface.dbo.tbl_GitRepository WHERE Name = @repositoryName)
BEGIN
    ...
END

当然也可能:

IF NOT EXISTS
(SELECT InternalRepositoryId FROM dbo.tbl_GitRepository WHERE Name = @repositoryName)
BEGIN
    ...
END

它的工作完全正常。我想提一下dbo是另一个数据库的Schema。现在我想做这样的事情:

DECLARE @schema [nvarchar](400);
SET @schema = 'dbo';

IF NOT EXISTS
(SELECT InternalRepositoryId FROM @schema.tbl_GitRepository WHERE Name = @repositoryName)
BEGIN
    ...
END

DECLARE @schemaTable [nvarchar](400);
SET @schemaTable = 'dbo.tbl_GitRepository';

IF NOT EXISTS
(SELECT InternalRepositoryId FROM @schemaTable WHERE Name = @repositoryName)
BEGIN
    ...
END

现在我已经尝试了一些动态的SQL但它不会没有错误地工作:

DECLARE @schemaTable [nvarchar](400);
SET @schemaTable = 'dbo.tbl_GitRepository';
DECLARE @sql [nvarchar](4000);
SET @sql = 'SELECT InternalRepositoryId FROM ' + @schemaTable + ' WHERE Name = ' + @repositoryName;

IF NOT EXISTS
(EXECUTE sp_executesql @sql)
BEGIN
    ...
END

然后我在EXECUTE处收到错误:"' EXECUTE'附近的语法错误。期待'('或SELECT"以及一些小错误。

有没有人知道如何做到这一点?

编辑:IF声明是一个大问题

1 个答案:

答案 0 :(得分:1)

您需要将整个IF NOT EXISTS放在动态sql中。

DECLARE @schemaTable [nvarchar](400);
SET @schemaTable = 'dbo.tbl_GitRepository';
DECLARE @sql [nvarchar](4000);
SET @sql = 'IF NOT EXISTS ( SELECT InternalRepositoryId FROM ' + @schemaTable + ' WHERE Name = ''' + @repositoryName + ''' )' + CHAR(10) +
'BEGIN SELECT 1' + CHAR(10) + ' END';

EXECUTE sp_executesql @sql

选择1是您放置实际陈述的地方