DECLARE @SQL Varchar(Max)
DECLARE @DESCR Varchar(Max)
-- Customer enters description into @Descr
SET @SQL = 'Update TableName SET FieldName='''
+ @DESCR
+ ''' WHERE ID=123'
Run Code Online (Sandbox Code Playgroud)
问题是当客户将撇号输入@Descr变量时.
问:在Microsoft SQL Server 2005中,如何用双撇号替换所有的萎缩?
我有一个数据库,其中登录数据库的主用户没有直接对任何表的权限.用户需要执行已明确授予它的存储过程.这涵盖了所需的任何简单的CRUD操作.但是现在,我需要动态执行SQL,但我希望在用户上保持相同的安全级别.一个例子是
UPDATE [Table] SET [Column 1] = @Column1
Run Code Online (Sandbox Code Playgroud)
但在这种情况下[第1列]及其值将在运行时设置.
我知道在存储过程中执行动态代码的唯一方法是使用sp_runsql,但是出于安全原因,创建使用sp_runsql执行动态查询的存储过程会失败(并且通常不是很聪明)
任何人都可以想到一种实现这种功能和安全性的方法吗?
我有这样一张桌子:
TABLE: FACTS
ID KEY VALUE
1 name Jeremy
1 height 5'11
1 awesomeness 10
2 name Mark
2 awesomeness 4
3 height 4'6
Run Code Online (Sandbox Code Playgroud)
因此,(ID,KEY)元组可以被视为主键.
我试图返回这样的行:
ID NAME HEIGHT AWESOMENESS
1 Jeremy 5'11 10
2 Mark (null) 4
3 (null) 4'6 (null)
Run Code Online (Sandbox Code Playgroud)
除了通过对每列进行子选择之外,如何获取键值,如果它们在那里,并将它们收集到我的单行中?我到目前为止尝试的是:
SELECT
id,
CASE WHEN facts.key = 'name' THEN value END name,
CASE WHEN facts.key = 'height' THEN value END height,
CASE when facts.key = 'awesomeness' THEN value END awesomeness
FROM
facts
WHERE
facts.id in (1,2,3)
Run Code Online (Sandbox Code Playgroud)
但是由于显而易见的原因,每个匹配的键返回一行,而不是每个id一行.
我怎样才能按照我想要的方式去做? …
全部,我有以下动态SQL查询
DECLARE @TableName NVARCHAR(255);
SET @TableName = 'BadCodesErrSumm';
DECLARE @DropSql NVARCHAR(MAX);
SET @DropSql =
'IF EXISTS (SELECT *
FROM Report.sys.objects
WHERE name = ''' + @TableName + ''' AND type = ''U'')
DROP TABLE [IPAReport]..[' + @TableName + '];'
PRINT @DropSql;
EXEC @DropSql;
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误
Msg 203, Level 16, State 2, Line 11
The name 'IF EXISTS (SELECT *
FROM Report.sys.objects
WHERE name = 'BadCodesErrSumm' AND type = 'U')
DROP TABLE [Report]..[BadCodesErrSumm];' is not a valid identifier.
Run Code Online (Sandbox Code Playgroud)
但是,打印输出
IF EXISTS (SELECT …Run Code Online (Sandbox Code Playgroud) 我有以下存储过程创建一个视图:
ALTER PROC Proc_Guards_By_Client
(
@client_number INT,
@client_name NVARCHAR(16)
)
AS
BEGIN
IF EXISTS(select * FROM sys.views where name = 'vwGuardsByClients')
BEGIN
EXEC ('CREATE VIEW vwGuardsByClients
AS
SELECT TOP 1000
cgt.[guard_id],
sg.first_name,
sg.last_name,
sg.ammunition_quantity
FROM [sws4].[dbo].[client_guard_tracking] cgt
INNER JOIN CLIENTS c
ON c.client_number = cgt.client_number
INNER JOIN security_guard sg
ON sg.guard_id = cgt.guard_id
WHERE cgt.client_number = @client_number
OR c.client_name = @client_name
')
END
ELSE
BEGIN
EXEC ('UPDATE VIEW vwGuardsByClients
SELECT TOP 1000
cgt.[guard_id],
sg.first_name,
sg.last_name,
sg.ammunition_quantity
FROM [sws4].[dbo].[client_guard_tracking] cgt
INNER …Run Code Online (Sandbox Code Playgroud) t-sql stored-procedures dynamic-sql sql-server-2008 sql-view
我有一个查询如下,根据要求执行.
DECLARE @count varchar(20)
SET @count = (SELECT COUNT(*) FROM emp)
PRINT 'Employee Count: '+@count
SELECT @count
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要使用动态SQL,我没有得到我想要的结果.我的动态SQL代码如下:
DECLARE @count varchar(10)
DECLARE @sqlQuery varchar(500)
SET @sqlQuery = 'SET '+@count +'= (SELECT COUNT(*) FROM emp)'
EXEC (@sqlQuery)
PRINT 'Employee Count: '+@count
SELECT @count
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个NULL作为输出.
应该做什么?可以帮我说一下我哪里出错了?
我在这个任务就是我需要努力修剪所有尾随空格从每列所有的表在我的PostgreSQL Database.
我有
update tbl_sale set product=trim(product) where product LIKE '% '
Run Code Online (Sandbox Code Playgroud)
这将TRIM在product 列于表 tbl_sale.
在我的数据库 中有137个表,如果它有尾随空格,那么我的数据库中的TRIM所有列是否可能?
我需要检查来自不同数据库的表的存在.我知道如何静态地执行此操作.但我想动态传递表名和数据库名.
所以这是期望,
Declare @tablename varchar(100) = 'testtable', @dbName Varchar(100) = 'TestDB',@isexist varchar(100)
If exists (select 1 from @dbName..sysobjects where name = @tablename)
Set @isexists = 'Table Exists'
Else set @isexists = 'Table do not exist'
Run Code Online (Sandbox Code Playgroud) 编辑
看来我的问题是当这个select语句返回null时(我正在尝试处理的情况 - 当它返回null时,我希望我的新值为-999).如果在找到null时出错,我怎么能这样做呢?
原版的
我已经阅读了有关此错误的所有其他SO帖子,但其中没有一个似乎解决了我的问题的根源.
错误非常简单 - 我的EXECUTE语句中的一个参数为null.大.但是,我在调用之前打印出构成我的EXECUTE语句的每个值,并且我可以清楚地看到没有值为null.
码:
CREATE FUNCTION inform_icrm_prob_flow_query(tablename text, location_id int,
product_date_str text, lead_time_start int,
lead_time_end int, first_member_id int,
last_member_id int, dest_file text)
RETURNS void AS $$
DECLARE
count int;
product_date TIMESTAMPTZ;
interval_lead_time_start text;
interval_lead_time_end text;
curr_value double precision;
query text;
BEGIN
product_date := product_date_str::TIMESTAMPTZ;
count := first_member_id;
curr_value := 0;
interval_lead_time_start := ''''|| product_date ||'''::timestamptz +
interval '''||lead_time_start||' hours''';
interval_lead_time_end := ''''|| product_date ||'''::timestamptz +
interval '''||lead_time_end||' hours'' -
interval ''6 hours''';
--create our …Run Code Online (Sandbox Code Playgroud) 以下查询中的感叹号(!)标记是什么?
l_sql := q'!
SELECT CASE WHEN FILTER_CNT = 0 THEN NULL ELSE FILTER_LIST END AS FILTER_LIST
FROM
(
SELECT 'TABLE_NAME NOT LIKE ' || LISTAGG(''''||EXCLUSION_CRITERIA||'''', ' AND TABLE_NAME NOT LIKE ') WITHIN GROUP (ORDER BY ROWNUM) AS FILTER_LIST, COUNT(*) AS FILTER_CNT
FROM !'|| p_after_owner ||q'!.UT_TABLE_EXCLUSION
WHERE EXCLUSION_TYPE = 'P'
)
!';
Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
t-sql ×5
sql ×4
sql-server ×3
oracle ×2
postgresql ×2
pivot ×1
plpgsql ×1
plsql ×1
psql ×1
sql-view ×1