动态sql的一个疑问

qq_37753824 2018-11-06 02:07:17
set @str='select @real=@TextColumnName from '+@TableName+' where @ValueColumnName=@Value'
exec sp_executesql @str,N'@real nvarchar(255) output,@TextColumnName varchar(255),@ValueColumnName varchar(255),@Value varchar(255)',@real output,@TextColumnName,@ValueColumnName,@Value
其中@Value 为 ‘’两上引号。就查不出来了,这怎么解决?
...全文
27 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2018-11-06
  • 打赏
  • 举报
回复
@TextColumnName 和 @ValueColumnName 和 @TableName 一样,@TableName楼主知道拼接起来,那两个和这个字段意思是一样的
吉普赛的歌 版主 2018-11-06
  • 打赏
  • 举报
回复
引用 6 楼 qq_37753824 的回复:
嗯 明白了,所以 @TextColumnName @TableName @ValueColumnName 这三个参数我在这条动态sql里也可以不传了对吧?
是的, 已经拼好的不需要再赋值了。只是放在参数列表也不会报错。
SET @str = 'select @real='+@TextColumnName+' from ' + @TableName + ' where '+@ValueColumnName+'=@Value'
EXEC sp_executesql @str,
     N'@real nvarchar(255) output,@Value varchar(255)',
     @real OUTPUT,
     @Value
qq_37753824 2018-11-06
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
[quote=引用 4 楼 qq_37753824 的回复:]
你这样不对啊 4个上引号转义了 值就是只有1个上引号。我表中的值就是两个上引号


赋值很简单,随便你改就是了。SQL 语句写正确才是根本。

下面做了个测试:
USE [tempdb]
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
id INT PRIMARY KEY,
n NVARCHAR(50)
)
GO
SET NOCOUNT ON
INSERT INTO t(id,n) VALUES (1,'123');
INSERT INTO t(id,n) VALUES (2,'''''');
GO
--------- 以上为测试表,测试数据 ---------


DECLARE @str NVARCHAR(MAX)
,@tableName NVARCHAR(MAX)
,@ValueColumnName NVARCHAR(MAX)
,@Value NVARCHAR(MAX)
,@real NVARCHAR(MAX)
,@TextColumnName NVARCHAR(MAX)
SET @tableName='t'
SET @TextColumnName='id'
SET @ValueColumnName='n'
SET @Value='''''' --赋值

--所有数据库对象,查询不允许用变量代替,包括 数据库名、表名、字段名
SET @str = 'select @real='+@TextColumnName+' from ' + @TableName + ' where '+@ValueColumnName+'=@Value'
EXEC sp_executesql @str,
N'@real nvarchar(255) output,@TextColumnName varchar(255),@ValueColumnName varchar(255),@Value varchar(255)',
@real OUTPUT,
@TextColumnName,
@ValueColumnName,
@Value

SELECT @real AS r
/*
r
------
2
*/

[/quote] 嗯 明白了,所以 @TextColumnName @TableName @ValueColumnName 这三个参数我在这条动态sql里也可以不传了对吧?
吉普赛的歌 版主 2018-11-06
  • 打赏
  • 举报
回复
引用 4 楼 qq_37753824 的回复:
你这样不对啊 4个上引号转义了 值就是只有1个上引号。我表中的值就是两个上引号
赋值很简单,随便你改就是了。SQL 语句写正确才是根本。 下面做了个测试:
USE [tempdb]
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	n NVARCHAR(50)	
)
GO
SET NOCOUNT ON
INSERT INTO t(id,n) VALUES (1,'123');
INSERT INTO t(id,n) VALUES (2,'''''');
GO
--------- 以上为测试表,测试数据 ---------


DECLARE @str NVARCHAR(MAX)
	,@tableName NVARCHAR(MAX)
	,@ValueColumnName NVARCHAR(MAX)
	,@Value NVARCHAR(MAX)
	,@real NVARCHAR(MAX)
	,@TextColumnName NVARCHAR(MAX)
SET @tableName='t'
SET @TextColumnName='id'
SET @ValueColumnName='n'
SET @Value=''''''		--赋值

--所有数据库对象,查询不允许用变量代替,包括 数据库名、表名、字段名
SET @str = 'select @real='+@TextColumnName+' from ' + @TableName + ' where '+@ValueColumnName+'=@Value'
EXEC sp_executesql @str,
     N'@real nvarchar(255) output,@TextColumnName varchar(255),@ValueColumnName varchar(255),@Value varchar(255)',
     @real OUTPUT,
     @TextColumnName,
     @ValueColumnName,
     @Value

SELECT @real  AS r
/*
r
------
2
*/
qq_37753824 2018-11-06
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
你写的 SQL 本身就有问题。
可按下面的改一下:
USE [master]
GO
DECLARE @str NVARCHAR(MAX)
,@tableName NVARCHAR(MAX)
,@ValueColumnName NVARCHAR(MAX)
,@Value NVARCHAR(MAX)
,@real NVARCHAR(MAX)
,@TextColumnName NVARCHAR(MAX)
SET @tableName='dbo.spt_values'
SET @TextColumnName='number'
SET @ValueColumnName='name'
SET @Value=''''

--所有数据库对象,查询不允许用变量代替,包括 数据库名、表名、字段名
SET @str = 'select @real='+@TextColumnName+' from ' + @TableName + ' where '+@ValueColumnName+'=@Value'
EXEC sp_executesql @str,
N'@real nvarchar(255) output,@TextColumnName varchar(255),@ValueColumnName varchar(255),@Value varchar(255)',
@real OUTPUT,
@TextColumnName,
@ValueColumnName,
@Value

SELECT @real
你这样不对啊 4个上引号转义了 值就是只有1个上引号。我表中的值就是两个上引号
qq_37753824 2018-11-06
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
@Value 为 ‘’两上引号时,把@ValueColumnName也设置成两个引号

楼主这个where条件是什么意思?
@ValueColumnName在表里的值就是‘’ 两个上引号。我这句在存储过程中用的。
存储过程传值的时候@Value = N'''''' 是这个样子。我把@Value 在存储过程中print出来也是'',但这个sql就是查不出来。其他的也都是对的。
吉普赛的歌 版主 2018-11-06
  • 打赏
  • 举报
回复
你写的 SQL 本身就有问题。 可按下面的改一下:
USE [master]
GO
DECLARE @str NVARCHAR(MAX)
	,@tableName NVARCHAR(MAX)
	,@ValueColumnName NVARCHAR(MAX)
	,@Value NVARCHAR(MAX)
	,@real NVARCHAR(MAX)
	,@TextColumnName NVARCHAR(MAX)
SET @tableName='dbo.spt_values'
SET @TextColumnName='number'
SET @ValueColumnName='name'
SET @Value=''''

--所有数据库对象,查询不允许用变量代替,包括 数据库名、表名、字段名
SET @str = 'select @real='+@TextColumnName+' from ' + @TableName + ' where '+@ValueColumnName+'=@Value'
EXEC sp_executesql @str,
     N'@real nvarchar(255) output,@TextColumnName varchar(255),@ValueColumnName varchar(255),@Value varchar(255)',
     @real OUTPUT,
     @TextColumnName,
     @ValueColumnName,
     @Value

SELECT @real 
二月十六 版主 2018-11-06
  • 打赏
  • 举报
回复
@Value 为 ‘’两上引号时,把@ValueColumnName也设置成两个引号

楼主这个where条件是什么意思?

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧