sq

凡人皆侑一死 2017-09-22 09:53:28
USE [KFT_LOG]
GO
/****** Object: StoredProcedure [dbo].[getmylog] Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
if OBJECT_ID('mylog') is not null
drop procedure mylog
go
create procedure [dbo].[mylog](@billno varchar(20),@month varchar(6))
as
begin
declare @name varchar(50),@type varchar(10),@sql Nvarchar(max),@procname varchar(100)
set @type=left(@billno,2)
set @name='dbo.KFT_DebugLog2_'+@month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
if @type='KH'
begin
set @procname='applynew'
end
if @type='TJ' or @type='HJ' or @type='YJ'
begin
set @procname='exchange'
end
if @type='WX'
begin
set @procname='repair'
end
set @sql='select * from @tablename where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@tablename as varchar(50),@t as varchar(50),@b as varchar(50)',@name,@procname,@billno
print @sql
end


为什么这个sql 打印出来变成select * from @tablename where procname like '%@t%' and parameters like '%@b%' 我不是往里面传了参数吗,这个@t @b咋变成字符串了,我不是在动态里面声明了是要传入变量吗? 是sql server 数据库
...全文
572 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2017-09-22
  • 打赏
  • 举报
回复
表名没法当作参数, 只能直接拼接到SQL里
听雨停了 2017-09-22
  • 打赏
  • 举报
回复

set @sql='select * from '+@name+' where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@t as varchar(50),@b as varchar(50)',@procname,@billno
PRINT @sql
就像楼上说的,执行sp_executesql时,表名不能是传进去的参数,所以为了正确执行你得用变量代替里面的表名。 这样就可以正确的执行了,但是打印出来的@sql还是原来的,因为打印的时候里面的@t和@b就是一个字符
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
引用 16 楼 verynicemen 的回复:
[quote=引用 15 楼 sinat_28984567 的回复:] [quote=引用 14 楼 verynicemen 的回复:] [quote=引用 10 楼 sinat_28984567 的回复:] [quote=引用 8 楼 verynicemen 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:] 不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
     SET @TableName = 'class ';
     SET @OrderID = 10251;
     SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
    EXEC sp_executesql
        @stmt = @sql,
        @params = N'@OID AS INT ',
       @OID = @OrderID
你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗[/quote] 这种方式可以,但是不能print,得是exec(@sql) ,楼主那个直接exce有问题吗?[/quote] 不太明白你的意思,直接exec肯定是不行的吧,用exec sp_executesql 不是应可以吗[/quote] 对的,我说的就是exec sp_executesql 有问题吗?如果想用print调试,就得拼接字符串。如果想用这种输入输出参数的,就得用exec sp_executesql
USE [KFT_LOG]
GO
/****** Object:  StoredProcedure [dbo].[getmylog]    Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
if OBJECT_ID('mylog') is not null
drop procedure mylog
go
create procedure [dbo].[mylog](@billno varchar(20),@month varchar(6))
as
begin
declare @name varchar(50),@type varchar(10),@sql Nvarchar(max),@procname varchar(100)
set @type=left(@billno,2)
set @name='dbo.KFT_DebugLog2_'+@month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
if @type='KH'
begin
set @procname='applynew'
end
if @type='TJ' or @type='HJ' or @type='YJ'
begin
set @procname='exchange'
end
if @type='WX'
begin
set @procname='repair'
end
set @sql='select * from @tablename where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@tablename as varchar(50),@t as varchar(50),@b as varchar(50)',@name,@procname,@billno
--PRINT @sql
end
[/quote] 有问题啊,报底下这个错误,我不是在sp_executesql中声明过了吗 消息 1087,级别 16,状态 1,第 1 行 必须声明表变量 "@tablename"。 [/quote] 表名不能是参数的。
USE [KFT_LOG]
GO
/****** Object:  StoredProcedure [dbo].[getmylog]    Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
if OBJECT_ID('mylog') is not null
drop procedure mylog
go
create procedure [dbo].[mylog](@billno varchar(20),@month varchar(6))
as
begin
declare @name varchar(50),@type varchar(10),@sql Nvarchar(max),@procname varchar(100)
set @type=left(@billno,2)
set @name='dbo.KFT_DebugLog2_'+@month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
if @type='KH'
begin
set @procname='applynew'
end
if @type='TJ' or @type='HJ' or @type='YJ'
begin
set @procname='exchange'
end
if @type='WX'
begin
set @procname='repair'
end
set @sql='select * from '+ @name+' where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@t as varchar(50),@b as varchar(50)',@procname,@billno
--PRINT @sql
end
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
引用 14 楼 verynicemen 的回复:
[quote=引用 10 楼 sinat_28984567 的回复:] [quote=引用 8 楼 verynicemen 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:] 不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
     SET @TableName = 'class ';
     SET @OrderID = 10251;
     SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
    EXEC sp_executesql
        @stmt = @sql,
        @params = N'@OID AS INT ',
       @OID = @OrderID
你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗[/quote] 这种方式可以,但是不能print,得是exec(@sql) ,楼主那个直接exce有问题吗?[/quote] 不太明白你的意思,直接exec肯定是不行的吧,用exec sp_executesql 不是应可以吗[/quote] 对的,我说的就是exec sp_executesql 有问题吗?如果想用print调试,就得拼接字符串。如果想用这种输入输出参数的,就得用exec sp_executesql
USE [KFT_LOG]
GO
/****** Object:  StoredProcedure [dbo].[getmylog]    Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
if OBJECT_ID('mylog') is not null
drop procedure mylog
go
create procedure [dbo].[mylog](@billno varchar(20),@month varchar(6))
as
begin
declare @name varchar(50),@type varchar(10),@sql Nvarchar(max),@procname varchar(100)
set @type=left(@billno,2)
set @name='dbo.KFT_DebugLog2_'+@month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
if @type='KH'
begin
set @procname='applynew'
end
if @type='TJ' or @type='HJ' or @type='YJ'
begin
set @procname='exchange'
end
if @type='WX'
begin
set @procname='repair'
end
set @sql='select * from @tablename where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@tablename as varchar(50),@t as varchar(50),@b as varchar(50)',@name,@procname,@billno
--PRINT @sql
end
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
引用 11 楼 z10843087 的回复:
[quote=引用 4 楼 sinat_28984567 的回复:] CSDN 我也真是醉了,帖子人工审核,半天审核不过,在电脑上能看见,无法点击,只能在手机上处理,手机上能点击,但写代码太不方便了
哈哈,我也发现了,最近更新才变成这样的。这个帖子我就一直点不进来。[/quote] 我在客服版和他们反映过,可能不在在乎了……管理员下班之后,CSDN新帖子就不能看了,只能在手机上看,不方便
OwenZeng_DBA 2017-09-22
  • 打赏
  • 举报
回复
引用 11 楼 z10843087 的回复:
[quote=引用 4 楼 sinat_28984567 的回复:] CSDN 我也真是醉了,帖子人工审核,半天审核不过,在电脑上能看见,无法点击,只能在手机上处理,手机上能点击,但写代码太不方便了
哈哈,我也发现了,最近更新才变成这样的。这个帖子我就一直点不进来。[/quote] 我觉的他应该设置一个策略,比如经常发帖子的,使用时间多的,就可以自动通过,那些新注册的才人工审核
OwenZeng_DBA 2017-09-22
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
CSDN 我也真是醉了,帖子人工审核,半天审核不过,在电脑上能看见,无法点击,只能在手机上处理,手机上能点击,但写代码太不方便了
哈哈,我也发现了,最近更新才变成这样的。这个帖子我就一直点不进来。
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
引用 8 楼 verynicemen 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] 不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
     SET @TableName = 'class ';
     SET @OrderID = 10251;
     SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
    EXEC sp_executesql
        @stmt = @sql,
        @params = N'@OID AS INT ',
       @OID = @OrderID
你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗[/quote] 这种方式可以,但是不能print,得是exec(@sql) ,楼主那个直接exce有问题吗?
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 verynicemen的回复:
[quote=引用 1 楼 qq_37170555 的回复:] 用+号拼接起来,你这样写不行的
这个为什么不行啊,我不是传入参数了吗[/quote] 你这样写进去的就是字符,不是变量了
凡人皆侑一死 2017-09-22
  • 打赏
  • 举报
回复
引用 15 楼 sinat_28984567 的回复:
[quote=引用 14 楼 verynicemen 的回复:]
[quote=引用 10 楼 sinat_28984567 的回复:]
[quote=引用 8 楼 verynicemen 的回复:]
[quote=引用 3 楼 sinat_28984567 的回复:]
不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:

 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
SET @TableName = 'class ';
SET @OrderID = 10251;
SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
EXEC sp_executesql
@stmt = @sql,
@params = N'@OID AS INT ',
@OID = @OrderID

你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗[/quote]
这种方式可以,但是不能print,得是exec(@sql) ,楼主那个直接exce有问题吗?[/quote]
不太明白你的意思,直接exec肯定是不行的吧,用exec sp_executesql 不是应可以吗[/quote]
对的,我说的就是exec sp_executesql 有问题吗?如果想用print调试,就得拼接字符串。如果想用这种输入输出参数的,就得用exec sp_executesql
USE [KFT_LOG]
GO
/****** Object: StoredProcedure [dbo].[getmylog] Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
if OBJECT_ID('mylog') is not null
drop procedure mylog
go
create procedure [dbo].[mylog](@billno varchar(20),@month varchar(6))
as
begin
declare @name varchar(50),@type varchar(10),@sql Nvarchar(max),@procname varchar(100)
set @type=left(@billno,2)
set @name='dbo.KFT_DebugLog2_'+@month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
if @type='KH'
begin
set @procname='applynew'
end
if @type='TJ' or @type='HJ' or @type='YJ'
begin
set @procname='exchange'
end
if @type='WX'
begin
set @procname='repair'
end
set @sql='select * from @tablename where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@tablename as varchar(50),@t as varchar(50),@b as varchar(50)',@name,@procname,@billno
--PRINT @sql
end
[/quote]
有问题啊,报底下这个错误,我不是在sp_executesql中声明过了吗
消息 1087,级别 16,状态 1,第 1 行
必须声明表变量 "@tablename"。
凡人皆侑一死 2017-09-22
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 8 楼 verynicemen 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:] 不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
     SET @TableName = 'class ';
     SET @OrderID = 10251;
     SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
    EXEC sp_executesql
        @stmt = @sql,
        @params = N'@OID AS INT ',
       @OID = @OrderID
你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗[/quote] 这种方式可以,但是不能print,得是exec(@sql) ,楼主那个直接exce有问题吗?[/quote] 不太明白你的意思,直接exec肯定是不行的吧,用exec sp_executesql 不是应可以吗
凡人皆侑一死 2017-09-22
  • 打赏
  • 举报
回复
引用 6 楼 qq_37170555 的回复:
[quote=引用 2 楼 verynicemen的回复:][quote=引用 1 楼 qq_37170555 的回复:] 用+号拼接起来,你这样写不行的
这个为什么不行啊,我不是传入参数了吗[/quote] 你这样写进去的就是字符,不是变量了[/quote] 我有在sp_executesql后面声明是变量啊
凡人皆侑一死 2017-09-22
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
 DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;
     SET @TableName = 'class ';
     SET @OrderID = 10251;
     SET @sql = 'SELECT * FROM '+@TableName+' WHERE id = @OID ORDER BY id DESC'
    EXEC sp_executesql
        @stmt = @sql,
        @params = N'@OID AS INT ',
       @OID = @OrderID
你看看这种写法也是吧变量放在字符串里面,然后在sp_executesql中声明了@sql中的@oid是变量,在传入参数,这跟我的不一样吗
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
试试这样:
USE [KFT_LOG]
GO
/****** Object: StoredProcedure [dbo].[getmylog] Script Date: 09/19/2017 15:05:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('mylog') IS NOT NULL
DROP PROCEDURE mylog
GO
CREATE PROCEDURE [dbo].[mylog]
(
@billno VARCHAR(20) ,
@month VARCHAR(6)
)
AS
BEGIN
DECLARE @name VARCHAR(50) ,
@type VARCHAR(10) ,
@sql NVARCHAR(MAX) ,
@procname VARCHAR(100)
SET @type = LEFT(@billno, 2)
SET @name = 'dbo.KFT_DebugLog2_' + @month
/*
set @name='dbo.KFT_DebugLog2_'+convert(varchar(4),GETDATE(),120)+cast(DATEPART(MM,GETDATE()) as varchar(10))
自动获取当前月份作为查询表名
*/
IF @type = 'KH'
BEGIN
SET @procname = 'applynew'
END
IF @type = 'TJ'
OR @type = 'HJ'
OR @type = 'YJ'
BEGIN
SET @procname = 'exchange'
END
IF @type = 'WX'
BEGIN
SET @procname = 'repair'
END
SET @sql = 'select * from ' + @name + ' where procname like ''%'
+ @procname + '%'' and parameters like ''%' + @billno + '%'''
EXEC(@sql)
PRINT @sql
END
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
DECLARE @sql VARCHAR(100),
@tablename VARCHAR(20),
@t VARCHAR(20),
@b VARCHAR(20)

SET @tablename = 'myTable';
SET @t = 'myPro';
SET @b = 'test'
SET @sql = 'select * from ' + @tablename + ' where procname like ''%' + @t +
'%'' and parameters like ''%' + @b + '%'''

PRINT @sql
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
CSDN 我也真是醉了,帖子人工审核,半天审核不过,在电脑上能看见,无法点击,只能在手机上处理,手机上能点击,但写代码太不方便了
二月十六 版主 2017-09-22
  • 打赏
  • 举报
回复
不能把变量直接放到字符串中,会当字符串处理的,楼主这种情况得拼接字符串:
凡人皆侑一死 2017-09-22
  • 打赏
  • 举报
回复
引用 1 楼 qq_37170555 的回复:
用+号拼接起来,你这样写不行的
这个为什么不行啊,我不是传入参数了吗
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
用+号拼接起来,你这样写不行的
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
引用 22 楼 verynicemen 的回复:
[quote=引用 18 楼 qq_37170555 的回复:]

set @sql='select * from '+@name+' where procname like ''%@t%'' and parameters like ''%@b%'''
exec sp_executesql @sql,N'@t as varchar(50),@b as varchar(50)',@procname,@billno
PRINT @sql
就像楼上说的,执行sp_executesql时,表名不能是传进去的参数,所以为了正确执行你得用变量代替里面的表名。 这样就可以正确的执行了,但是打印出来的@sql还是原来的,因为打印的时候里面的@t和@b就是一个字符
表名不能做变量传参数,执行exec sp_executesql 语句like后面的@t,@b好像也是把我当字符串处理了,没有传入我想要的参数[/quote] 那样写确实有问题,主要是因为有like在里面,如果不是like是=的话那样写就没问题。你可以用下面的方法,随便一种都可以实现

--方法1
--你把%写进参数值里,像下面这样
set @sql='select * from '+@name+' where procname like @t and parameters like @b%'
exec sp_executesql @sql,N'@t as varchar(50),@b as varchar(50)',N'%'+@procname+'%',N'%'+@billno+'%'
PRINT @sql

--方法2
--或者你这样拼接sql也是可以执行的
set @sql='select * from '+@name+' where procname like ''%''+@t+''%'' and parameters like ''%''+@b+''%'''
exec sp_executesql @sql,N'@t as varchar(50),@b as varchar(50)',@procname,@billno
PRINT @sql
加载更多回复(3)

34,838

社区成员

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

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