声明值并执行它不能在同一个存储过程中使用?

时间:2016-04-15 13:19:38

标签: sql-server select stored-procedures declare

我在MS SQL Server中遇到错误。 我正在创建一个存储过程,我在其中声明一个值,我将其设置为select语句,然后执行它。然后我想在稍后的同一个存储过程中使用它,但它仍然将它视为一个select语句,而不是语句的结果。

声明:

    let managedObjectModel = NSManagedObjectModel.init(contentsOfURL: modelURL)
    var managedObjectContext =  NSManagedObjectContext.init(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = NSPersistentStoreCoordinator.init(managedObjectModel: managedObjectModel)

    var error: NSError?
    let options = [NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true];
    let persistentStore = try! managedObjectContext.persistentStoreCoordinator?.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: options)

之后进行比较(不起作用):

Declare @functie varchar(255);
Set @functie = 'Select Functie From Medewerker m, Logins l where m.mdwnr = l.mdwnr And gebruikersnaam = ''' + @GebruikersNaam + '''' 
EXECUTE(@functie)
Print @functie

打印用于调试,不是必需的。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

你根本不需要动态sql。以下是设置变量值的查询。

Declare @functie varchar(255);
Select @functie = Functie 
From Medewerker m
join Logins l on m.mdwnr = l.mdwnr 
    And gebruikersnaam = @GebruikersNaam

此外,你应该养成使用ANSI-92样式连接的习惯,而不是使用逗号分隔的表格列表。 "更新"加入语法现已近30岁。

答案 1 :(得分:0)

您只能从EXEC获取数据到表格,然后您可以根据您的要求解析该信息。这是可能的例子:

DECLARE @sql nvarchar(255) = 'Select ''test''' 
DECLARE @result TABLE (functie nvarchar(100))
DECLARE @functie nvarchar(100)
INSERT INTO @result EXECUTE(@sql)
SET @functie = (SELECT TOP(1) functie FROM @result)
PRINT(@functie)

然而,之前的评论是完美的,您不需要动态SQL来执行此操作,并且参数化查询可以在SQL注入的情况下保存您的屁股(在您的代码中看起来可能)。

答案 2 :(得分:0)

先前的答案我解决了你的问题 - 我还要注意你的比较代码是不正确的 - 连续使用两个单引号字符解析为一个单引号字符(而不是被视为文本分隔符)。

如果您在结果中获得单引号,那么该代码应如下所示:

If '' + @functie + '' = '''Administrator''' Print @functie