【问题标题】:T-SQL: Problems with dynamic variable in SELECTT-SQL:SELECT 中的动态变量问题
【发布时间】:2017-07-18 22:23:12
【问题描述】:

我想将以下选择的结果存储到一个变量中。

SET @SearchSchema = '(SELECT REPLACE(name,''Change Log Setup'', ''Change Log Entry'') as Name  FROM ['+@DBName+'].sys.tables where name LIKE ''%$Change Log Setup'')'

我也尝试使用 exec sp_executesql。

这是整个代码:

DECLARE @DBName VARCHAR(5000);
DECLARE @period VARCHAR(5000);
DECLARE @SQLEXE VARCHAR(8000);
DECLARE @SearchSchema NVARCHAR(4000);
DECLARE @Authentification VARCHAR(1000);
DECLARE @Path VARCHAR(1000);
DECLARE @ServerName VARCHAR(1000);

SET @period = '''2017-01-01 00:00:00'' AND ''2017-12-31 23:59:59''';    
SET @Path = 'C:\Users\Public\Documents\';                                   
SET @Servername = '-S nav-ey-demo2\NAVDEMO';

SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%');
EXECUTE ('USE [' + @DBName+']'); Select db_name();

SET @SearchSchema = '(SELECT REPLACE(name,''Change Log Setup'', ''Change Log Entry'') as Name  FROM ['+@DBName+'].sys.tables where name LIKE ''%$Change Log Setup'')'

如果我使用

SELECT @SearchSchema

出现正确的值。

通过使用

PRINT '@SEARCHSCHEMA ' + @SearchSchema

显示 SELECT 字符串:

SEARCHSCHEMA (SELECT REPLACE(name,'Change Log Setup', 'Change Log Entry') as Name  FROM [Demo Database NAV (10-0)].sys.tables where name LIKE '%$Change Log Setup')

【问题讨论】:

  • 不清楚你的实际问题是什么。
  • 我想将 SELECT 结果存储到变量中。

标签: sql sql-server tsql


【解决方案1】:

首先您必须构建动态查询,然后调用sp_executesql 执行它,然后将结果存储到变量中。

DECLARE @DBName VARCHAR(5000);
DECLARE @period VARCHAR(5000);
DECLARE @SQLEXE VARCHAR(8000);
DECLARE @SearchSchema NVARCHAR(4000);
DECLARE @Authentification VARCHAR(1000);
DECLARE @Path VARCHAR(1000);
DECLARE @ServerName VARCHAR(1000);
DECLARE @QueryResult NVARCHAR(4000); 

SET @period = '''2017-01-01 00:00:00'' AND ''2017-12-31 23:59:59''';    --DON'T change the audit period. It is only allowed by the EY auditor. A change of this value can be easily detected.
SET @Path = 'C:\Users\Public\Documents\';                                   --you can change the path directory
SET @Servername = '-S nav-ey-demo2\NAVDEMO';

SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%');
EXECUTE ('USE [' + @DBName+']'); Select db_name();

SET @SearchSchema = '(SELECT @ResultOut = REPLACE(name,''Change Log Setup'', ''Change Log Entry'') as Name  FROM ['+@DBName+'].sys.tables where name LIKE ''%$Change Log Setup'')'

EXEC sp_executesql @SearchSchema, '@ResultOut NVARCHAR(4000) OUTPUT', @ResultOut=@QueryResult OUTPUT;

SELECT @QueryResult;

【讨论】:

  • 我不相信这会起作用,因为使用变量作为对象名称需要动态 sql。
  • @TabAlleman 你是对的......我错过了 FROM ['+@DBName+'] 部分......我已经更新了我的答案。
  • 不幸的是......它不起作用......消息 214,级别 16,状态 2,过程 sp_executesql,第 1 行 [批处理开始行 0] 过程需要参数 '@statement' 类型' ntext/nchar/nvarchar'.
  • @WIbadeneralp 尝试将 DBName 的声明更改为 NVARCHAR 而不是 VARCHAR,如果可行,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2013-01-29
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多